密码哈希是保护密码的重要方面,它将密码存储从明文转变为加密哈希。本文探讨了密码哈希的发展历程,从早期算法如MD5和SHA-1到今天推荐的更安全的方法,最后强调了每个网站使用随机密码的重要性。
在深入探讨密码哈希的历史和演变之前,重要的是要了解什么是哈希。进行哈希的方法,即哈希函数,旨在接收任何数据字符串或“输入”,并生成固定大小的字节字符串,通常称为“哈希”。这个过程具有几个关键特性,使其在安全性方面特别有用。
哈希函数的一个关键特性是它们对输入变化的敏感性。这被称为雪崩效应。即使输入中发生微小的变化,比如在密码中更改一个字符,也会生成完全不同的哈希。例如,字符串“password1”和“password2”的哈希看起来会完全不同,尽管两个输入的唯一区别是最后一个字符。这个特性对于保持数据完整性至关重要,因为它使得几乎不可能从哈希推断出原始输入。
此外,哈希函数是单向函数。这意味着它们被设计成计算上不可逆的。输出(哈希)不保留关于输入的具体细节,这些细节可以让人们在没有巨大计算努力的情况下重建原始数据。唯一可行的“逆转”哈希的方法是称为暴力破解的方法,即将所有可能的原始数据组合再次进行哈希,直到找到匹配的哈希。
在数字安全的早期,MD5(消息摘要算法 5)和SHA-1(安全哈希算法 1)被广泛用于密码哈希。这些算法在90年代初期发展,用于将明文密码转换为固定大小的哈希值。尽管它们初期非常安全,但它们对碰撞攻击的脆弱性很快使它们在安全应用中变得过时。
虽然哈希函数被设计为快速高效,但这种特性可能在密码安全方面有害,因为它使暴力攻击更容易。基于密码的密钥派生函数(PBKDFs),如PBKDF2、bcrypt和scrypt,旨在通过加入盐(以防止彩虹表攻击)和采用称为密钥扩展的技术来抵抗这些攻击。密钥扩展故意减慢哈希过程,这可以显著阻止未经授权的访问企图。
随着网络安全的发展,早期哈希算法如MD5和SHA-1的不足变得显而易见,促使了专门为密码安全设计的算法的发展,如bcrypt、scrypt和Argon2,或称为基于密码的密钥派生函数(PBKDFs)。
根据OWASP,推荐的密码哈希算法是bcrypt、scrypt和Argon2。这些算法因其对暴力攻击的强大防御能力及其内置的盐和密钥扩展机制而受青睐。
bcrypt是从Blowfish密码派生出来的密码哈希函数。它加入盐以防止彩虹表攻击,并使用成本参数增加计算时间(从而增加生成哈希的难度)。这个成本因子是可调的,可以随着硬件的改进进行扩展。
关键参数:
OWASP建议使用工作因子为10或更高,密码限制为72字节。
scrypt设计为既消耗内存又消耗时间,以抵抗大规模的定制硬件攻击。它可以配置为需要特定数量的内存,并且还包括盐和迭代次数,类似于PBKDF2。
关键参数:
OWASP建议使用至少(2^17)的CPU/内存成本参数,最小块大小为8(1024字节),并行化参数为1。
Argon2是2015年密码哈希竞赛的获胜者,有两个变体:Argon2d和Argon2i。Argon2d在侧信道攻击威胁较低的环境中进行优化,而Argon2i则优化为抗侧信道攻击。它还结合了bcrypt和scrypt的关键特性。
关键参数:
OWASP建议使用Argon2id,最小配置为19 MiB内存,2次迭代和1度并行。
鉴于安全威胁和对策的不断发展,保持密码安全的最新实践至关重要。欲了解最新和最全面的建议,请参考OWASP密码存储备忘单。确保定期查看这些指南,以符合网络安全的最佳实践。
虽然采用现代哈希算法至关重要,但创建和管理密码的方式也在维护安全性方面起关键作用。每个网站使用随机密码对于以下几个因素至关重要:
从MD5和SHA-1到现代算法如bcrypt和Argon2,密码哈希经历了显著的转变。随着网络威胁的不断演变,采用现代哈希算法并确保每个网站使用随机唯一密码是保障在线安全的关键实践。这些策略不仅能防止个别账户的泄露,还能增强整体安全态势,抵御日益复杂的攻击。