密码学/哈希
一位维基教科书用户建议将 密码学/哈希函数 合并到本章。 在 讨论页面 上讨论是否应该进行此合并。 |
一个摘要,有时简称为哈希,是哈希函数的结果,一个特定的数学函数或算法,可以描述为 。"哈希"需要是一个确定性的过程,因此,每次使用相同的哈希函数对输入块进行"哈希"时,生成的摘要或哈希值都是恒定的,并与输入数据保持可验证的关系。因此,这种类型的算法对信息安全非常有用。
其他称为密码哈希的过程,其功能类似于哈希,但需要额外的安全性,以保证形式或级别,保证不能从生成的哈希值中实际反转输入数据。即没有有用的逆哈希函数
此属性可以正式扩展以提供以下安全哈希的属性
- 抗原像 : 给定 H,应该很难找到满足 H = hash(M) 的 M。
- 抗第二原像: 给定一个输入 m1,应该很难找到另一个输入 m2(不等于 m1),使得 hash(m1) = hash(m2)。
- 抗碰撞: 应该很难找到两个不同的消息 m1 和 m2,使得 hash(m1) = hash(m2)。由于生日悖论,这意味着哈希函数必须具有比抗原像所需要的更大的图像。
哈希函数是算法的实现,该算法在给定一些数据作为输入时,会生成一个称为摘要的短结果。一个有用的哈希函数会生成固定长度的哈希值。
例如:如果我们的哈希函数是“X”,而我们的输入是“wiki”... 那么 X('wiki')= a5g78,即某个哈希值。
非密码哈希函数有许多应用,[1] 但在本节中,我们重点关注专门需要密码哈希函数的应用
密码哈希的典型用法如下:Alice 向 Bob 提出一个棘手的数学问题,并声称她已经解决了它。Bob 想自己尝试,但又想确定 Alice 并没有在吹牛。因此,Alice 写下她的解决方案,附加一个随机的 nonce,计算它的哈希值,并将哈希值告诉 Bob(同时保持解决方案的秘密)。这样,当 Bob 几天后自己想出解决方案时,Alice 可以验证他的解决方案,但仍然能够证明她之前已经有了解决方案。
在实际操作中,Alice 和 Bob 通常是计算机程序,秘密将是比声称的难题解决方案更难伪造的东西。上述应用称为承诺方案。安全哈希的另一个重要应用是验证消息完整性。例如,可以通过比较传输之前和之后(或任何其他事件)计算的消息摘要来确定消息(或文件)是否被修改(参见 Tripwire,一个利用此属性来防御恶意软件和恶意行为的系统)。消息摘要还可以用作可靠识别文件的方式。
一个相关的应用是密码验证。出于显而易见的原因,密码不应该以明文形式存储,而应该以摘要形式存储。在后面的章节中,将更详细地讨论密码处理 - 特别是为什么只对密码进行一次哈希是不够的。
哈希函数是消息认证 (HMAC) 的关键部分。
大多数分布式版本控制系统 (DVCS) 使用密码哈希。[2]
出于安全和性能的原因,大多数数字签名算法规定只对消息的摘要进行"签名",而不是对整个消息进行签名。哈希函数也可以用于生成伪随机位。
SHA-1、MD5 和 RIPEMD-160 是截至 2004 年最常用的消息摘要算法。2004 年 8 月,研究人员发现许多哈希函数(包括 MD5、SHA-0 和 RIPEMD)存在弱点。这使得人们对从这些哈希函数派生的后续算法的长期安全性产生了质疑。特别是,SHA-1(SHA-0 的加强版)、RIPEMD-128 和 RIPEMD-160(RIPEMD 的加强版)。SHA-0 和 RIPEMD 都不被广泛使用,因为它们被它们的加强版取代了。
稍后我们将讨论"生日攻击"和其他用于破坏哈希算法 的技术。
当使用哈希进行文件验证时,人们更喜欢运行速度非常快的哈希函数。他们希望能够尽快检测到损坏的文件(并将其排队重新传输、隔离等)。此类别中的一些流行哈希函数是
- BLAKE2b
- SHA-3
此外,SHA-256 (SHA-2) 和 SHA-1 在某些 CPU 指令集中也得到了硬件支持。
当使用哈希进行密码验证时,人们更喜欢运行时间较长的哈希函数。如果/当密码验证数据库(/etc/passwd
文件、/etc/shadow
文件等)意外泄露时,他们希望强制蛮力攻击者花费很长时间来测试每个猜测。[3] 此类别中的一些流行哈希函数是
- Argon2
- scrypt
- bcrypt
- PBKDF2
我们在密码学/安全密码 部分中更多地讨论密码哈希。
- 有关非密码哈希函数及其应用的更多信息,请参阅 算法实现/哈希。
- 有关非密码哈希函数最常见的应用,请参阅 数据结构/哈希表。
- Rosetta Code : 密码哈希函数 提供了多种编程语言中的密码哈希函数的实现。