密码学/哈希
一位维基教科书用户建议将密码学/哈希函数合并到本章中。 请在讨论页面上讨论是否应该进行合并。 |
摘要,有时简称为哈希,是哈希函数的结果,哈希函数是一种特定的数学函数或算法,可以描述为。"哈希"需要是一个确定性过程,因此,每次输入块被相同哈希函数"哈希"时,生成的摘要或哈希值都是恒定的,保持与输入数据的可验证关系。因此,这种类型的算法对信息安全很有用。
其他被称为密码哈希的过程,其功能类似于哈希,但需要额外的安全性,以保证形式或一定程度的保证,即生成的哈希值无法从输入数据中逆向推导出来。即,不存在有用的逆哈希函数
此属性可以正式扩展,以提供安全哈希的以下属性
- 抗原像 : 给定 H,应难以找到 M 使得 H = hash(M)。
- 抗第二原像: 给定输入 m1,应难以找到另一个输入 m2(不等于 m1),使得 hash(m1) = hash(m2)。
- 抗碰撞: 应难以找到两个不同的消息 m1 和 m2,使得 hash(m1) = hash(m2)。由于生日悖论,这意味着哈希函数必须具有比抗原像所需的更大的像空间。
哈希函数是算法的实现,该算法在给定某些数据作为输入时,将生成一个称为摘要的短结果。有用的哈希函数会生成固定长度的哈希值。
例如:如果我们的哈希函数是'X',并且我们的输入是'wiki'…那么 X('wiki')= a5g78,即某个哈希值。
非密码哈希函数有许多应用,[1] 但在本节中,我们将重点关注专门需要密码哈希函数的应用。
密码哈希的典型用法如下:爱丽丝向鲍勃提出一个难题,并声称她已经解决了。鲍勃想自己尝试一下,但他想确保爱丽丝没有在吹牛。因此,爱丽丝写下她的解决方案,添加一个随机的nonce,计算它的哈希值,并告诉鲍勃哈希值(同时保密解决方案)。这样,当鲍勃几天后自己想出解决方案时,爱丽丝可以验证他的解决方案,但仍然能够证明她之前就有了解决方案。
在实际应用中,爱丽丝和鲍勃通常是计算机程序,而秘密将比声称的难题解决方案更容易被伪造。上面的应用称为承诺方案。安全哈希的另一个重要应用是验证消息完整性。例如,可以通过比较传输前后的消息摘要来确定消息(或文件)是否发生过任何更改(或任何其他事件)(参见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 : 密码哈希函数提供了许多编程语言中密码哈希函数的实现。