--- title: "05-加密原理" created: 2025-12-02 tags: - 项目 aliases: - 加密原理 --- # 加密原理 ### BCrypt 的原理与特性 1. **哈希函数的特性**: 哈希函数(如 SHA-256 或 MD5)在给定相同的输入时总是会生成相同的输出。因此,如果使用简单的哈希函数加密密码,那么同样的密码会总是生成相同的哈希值。这意味着,如果数据库中的哈希值泄露,并且攻击者知道密码哈希算法,他们可以使用彩虹表(Rainbow Table)或者暴力破解的方法轻松推断出原始密码。 2. **BCrypt 加盐 (Salt)**: 为了应对上述问题,BCrypt 加入了 **盐值 (Salt)** 的概念。盐值是一个随机生成的值,每次对相同的明文密码进行加密时,都会生成一个不同的盐值,并将这个盐值与密码一起进行哈希。因此,即使是同样的明文密码,在不同的盐值下加密的结果也会不同。 **盐值的作用** 是增加密码的复杂度和多样性,使得相同的密码也会生成不同的哈希值,从而防止彩虹表攻击和大规模暴力破解。 3. **密码哈希的存储格式**: BCrypt 生成的哈希字符串通常包含三个主要部分: - **算法标识符**:如 `$2a$`,表示使用的算法类型。 - **工作因子**(Cost factor):表示加密的复杂度,数字越大加密的时间越长。 - **盐值**和**加密后的密码哈希值**:BCrypt 的输出中包含了盐值,因此在验证密码时,无需单独存储盐值。 例如: ```text $2a$10$6wV.6pqSMKLBEeMUJwH6Iui0jw7sjyyBr7z8kOVvhq9wUCtfwDl1C ``` 这个哈希值表示: - `$2a$`:算法标识符。 - `10`:工作因子,表示 2 的 10 次方个哈希循环。 - `6wV.6pqSMKLBEeMUJwH6Iui0jw7sjyyBr7z8kOVvhq9wUCtfwDl1C`:盐值和加密后的哈希密码。 4. **验证逻辑**: 当用户登录时,验证密码的过程并不是简单地将明文密码进行加密再进行比较,而是使用数据库中存储的哈希值提取其中的盐值,然后使用同样的盐值和用户输入的密码重新进行哈希计算。由于哈希算法是确定的,所以如果输入的密码正确,最终计算的结果与数据库中的哈希值会相同。 5. **工作因子 (Cost Factor)**: BCrypt 中的工作因子决定了加密过程的复杂度,工作因子越大,加密所需的时间越长,破解的难度也越大。随着硬件性能的提升,我们可以逐步增加工作因子来保持系统的安全性。 ### 为什么 BCrypt 更安全? BCrypt 的安全性主要来自于以下几点: - **盐值的使用**:使得相同的密码每次都会生成不同的哈希值,防止彩虹表攻击。 - **工作因子**:增加了密码哈希的计算复杂度,提高了暴力破解的成本。 - **加密结果不可逆**:即使攻击者拿到哈希值,也无法直接通过哈希值反推出原始密码。 ### 总结: 你所提到的 BCypt 在多次加密相同的明文密码时,生成的哈希值不同,这是由于它每次都会生成一个随机的盐值,并在加密过程中将盐值结合进去进行处理。验证时,BCrypt 提取存储的哈希中的盐值,用它来对用户输入的密码进行加密,这样只要密码相同,结果就会一致,从而验证成功。 BCrypt 所采用的这些方法使得它比传统的简单哈希算法更加安全,适用于密码存储的场景。 --- **项目分区导航**: [[04-RestController和Controller|RestController和Controller]] ⬅️ | 05-加密原理 | ➡️ [[06-处理http请求的注解|处理http请求的注解]]