常见的哈希算法包括 MD5、SHA1、SHA2、SHA3 等。然而,MD5 和 SHA1 已被证明具有较弱的抗碰撞性,因此不再被推荐用于密码存储。当前,推荐使用更为安全的算法,例如 SHA256 或更高级的专为密码存储设计的 KDF 算法(如 bcrypt、Argon2 等)。
常见的哈希算法包括 MD5、SHA1、SHA256 等。随着密码学领域的发展,MD5 和 SHA1 的抗碰撞性已被证明不足以抵御现代攻击,尤其是针对彩虹表(Rainbow table)攻击和碰撞攻击,这部分内容我们将在稍后讲到。因此,这些算法已不再被推荐用于密码存储。
目前,安全专家建议使用更为安全的哈希算法,SHA256 或 SHA3 都是比较好的选择。在密码存储场景中,使用专门设计的密码哈希函数则更为合适。例如,bcrypt、Argon2和 PBKDF2都是目前被广泛使用的密码哈希函数。其不仅能够提供比通用哈希函数更强的安全性,还具备可调的计算复杂度,能够有效抵御暴力破解攻击和硬件加速攻击(包括 GPU、ASIC 攻击等)。
尽管哈希算法具备不可逆性,但它们本质上是确定性的:相同的输入总会生成相同的哈希值。彩虹表是一种预计算的哈希值与对应明文的查找表,攻击者可以利用彩虹表等预计算攻击手段,轻松破解常见的密码。
为了解决这一问题,密码存储中普遍引入了“加盐”技术。盐(Salt)是一个随机生成的值,它会在密码进行哈希处理之前与密码组合。通过这种方式,即使两个用户使用了相同的密码,由于使用了不同的盐值,最终存储在数据库中的哈希值也将不同。这种策略有效抵御了彩虹表攻击,攻击者无法为每个可能的盐值与密码组合生成预计算的哈希表。