加密原理

BCrypt 的原理与特性

  1. 哈希函数的特性: 哈希函数(如 SHA-256 或 MD5)在给定相同的输入时总是会生成相同的输出。因此,如果使用简单的哈希函数加密密码,那么同样的密码会总是生成相同的哈希值。这意味着,如果数据库中的哈希值泄露,并且攻击者知道密码哈希算法,他们可以使用彩虹表(Rainbow Table)或者暴力破解的方法轻松推断出原始密码。

  2. BCrypt 加盐 (Salt): 为了应对上述问题,BCrypt 加入了 盐值 (Salt) 的概念。盐值是一个随机生成的值,每次对相同的明文密码进行加密时,都会生成一个不同的盐值,并将这个盐值与密码一起进行哈希。因此,即使是同样的明文密码,在不同的盐值下加密的结果也会不同。

    盐值的作用 是增加密码的复杂度和多样性,使得相同的密码也会生成不同的哈希值,从而防止彩虹表攻击和大规模暴力破解。

  3. 密码哈希的存储格式: BCrypt 生成的哈希字符串通常包含三个主要部分:

    • 算法标识符:如 $2a$,表示使用的算法类型。
    • 工作因子(Cost factor):表示加密的复杂度,数字越大加密的时间越长。
    • 盐值加密后的密码哈希值:BCrypt 的输出中包含了盐值,因此在验证密码时,无需单独存储盐值。

    例如:

    $2a$10$6wV.6pqSMKLBEeMUJwH6Iui0jw7sjyyBr7z8kOVvhq9wUCtfwDl1C
    

    这个哈希值表示:

    • $2a$:算法标识符。
    • 10:工作因子,表示 2 的 10 次方个哈希循环。
    • 6wV.6pqSMKLBEeMUJwH6Iui0jw7sjyyBr7z8kOVvhq9wUCtfwDl1C:盐值和加密后的哈希密码。
  4. 验证逻辑: 当用户登录时,验证密码的过程并不是简单地将明文密码进行加密再进行比较,而是使用数据库中存储的哈希值提取其中的盐值,然后使用同样的盐值和用户输入的密码重新进行哈希计算。由于哈希算法是确定的,所以如果输入的密码正确,最终计算的结果与数据库中的哈希值会相同。

  5. 工作因子 (Cost Factor): BCrypt 中的工作因子决定了加密过程的复杂度,工作因子越大,加密所需的时间越长,破解的难度也越大。随着硬件性能的提升,我们可以逐步增加工作因子来保持系统的安全性。

为什么 BCrypt 更安全?

BCrypt 的安全性主要来自于以下几点:

  • 盐值的使用:使得相同的密码每次都会生成不同的哈希值,防止彩虹表攻击。
  • 工作因子:增加了密码哈希的计算复杂度,提高了暴力破解的成本。
  • 加密结果不可逆:即使攻击者拿到哈希值,也无法直接通过哈希值反推出原始密码。

总结:

你所提到的 BCypt 在多次加密相同的明文密码时,生成的哈希值不同,这是由于它每次都会生成一个随机的盐值,并在加密过程中将盐值结合进去进行处理。验证时,BCrypt 提取存储的哈希中的盐值,用它来对用户输入的密码进行加密,这样只要密码相同,结果就会一致,从而验证成功。

BCrypt 所采用的这些方法使得它比传统的简单哈希算法更加安全,适用于密码存储的场景。


项目分区导航RestController和Controller ⬅️ | 05-加密原理 | ➡️ 处理http请求的注解