消息摘要算法(Message Digest Algorithm)也称为哈希算法(Hash Algorithm),是一种将任意长度的消息压缩成固定长度的摘要值的算法。常见的消息摘要算法有 MD5、SHA-1、SHA-256 等。
对于相同的输入消息,消息摘要算法总是生成相同的摘要值。无论何时对相同的内容进行哈希计算,结果都是一致的。例如,对文本 “Hello, World!” 进行哈希运算,每次都会得到相同的固定长度的哈希值。
从消息摘要值很难反向推导出原始消息。这意味着即使知道了摘要值,也无法确定原始消息的具体内容。消息摘要算法是一种单向函数,计算摘要值相对容易,但从摘要值恢复原始消息在计算上是不可行的。
很难找到两个不同的消息,使得它们的摘要值相同。这种特性确保了消息的完整性和唯一性。抗碰撞行分为弱抗碰撞性和强抗碰撞性:
弱抗碰撞性(Weak Collision - Resistance) 对于给定的消息 m1,很难找到另一个消息 m2,使得 hash(m1)==hash(m2)。这里的 “很难” 是从计算复杂度的角度来说的,即在合理的时间和资源限制下几乎不可能找到这样的。弱抗碰撞性主要用于保证消息的完整性。例如,在数字签名场景中,假设用户 A 要对消息进行签名,签名的依据是消息 m1 的哈希值 hash(m1)。如果攻击者能够轻易地找到另一个消息 m2 使得 hash(m1)==hash(m2),那么攻击者就可以用 m2 消息来伪造用户 A 的签名,这显然是不安全的。
强抗碰撞性(Strong Collision - Resistance) 很难找到两个不同的消息 m1 和 m2,使得 hash(m1)==hash(m2)。这里强调的是任意两个不同消息,而不是针对给定的一个消息。强抗碰撞性是一种更严格的安全要求。它在密码学和信息安全的许多应用场景中非常重要。例如,在证书颁发机构(CA)颁发数字证书时,证书中包含了用户的公钥等信息以及这些信息的哈希值。如果哈希算法不具有强抗碰撞性,攻击者可能找到两个不同的证书内容(公钥等信息不同)但哈希值相同,从而进行恶意攻击,如冒充合法用户。
强抗碰撞性包含了弱抗碰撞性。如果一个哈希函数具有强抗碰撞性,那么它必然具有弱抗碰撞性。因为强抗碰撞性要求对于任意两个不同消息都很难找到哈希值相同的情况,那么对于给定的一个消息,自然也很难找到另一个消息与之哈希值相同。
然而,一个哈希函数具有弱抗碰撞性,并不一定具有强抗碰撞性。例如,可能对于给定的某个消息很难找到另一个与之哈希值相同的消息,但对于消息空间中的其他消息组合,可能较容易找到哈希值相同的情况。
在文件传输、存储或通信过程中,发送方计算消息的摘要值并随消息一起发送。接收方收到消息后,重新计算消息的摘要值,并与接收到的摘要值进行比较。如果两个摘要值相同,则说明消息在传输过程中没有被篡改,保证了数据的完整性。
例如,在下载软件时,通常会提供软件文件的消息摘要值,用户可以在下载后计算文件的摘要值并与提供的值进行对比,以确保文件没有被损坏或篡改。例如:
注意:很多解压软件提供了对压缩包或文件计算摘要值的功能,下面是 7z 工具计算的消息摘要值:
遗憾的是,并没有计算 MD5 类型的消息摘要值。
在数字签名方案中,消息摘要算法用于对消息进行哈希运算,得到消息摘要。然后,签名者使用私钥对消息摘要进行加密,生成数字签名。接收方使用公钥解密数字签名得到消息摘要,并对收到的消息进行哈希运算得到另一个消息摘要。如果两个摘要值相同,则说明消息在传输过程中没有被篡改,并且签名是有效的。例如:
消息摘要算法的使用可以提高数字签名的效率,因为对较长的消息进行签名比较耗时,而对较短的消息摘要进行签名则相对快速。
在用户密码存储系统中,通常不会直接存储用户的明文密码,而是存储密码的消息摘要值。当用户登录时,系统计算用户输入密码的消息摘要值,并与存储的摘要值进行比较。如果相同,则说明用户输入的密码正确。这样即使数据库被泄露,攻击者也难以获取用户的原始密码。
为了增加安全性,可以在计算密码的摘要值之前,对密码进行加盐(添加随机字符串)处理,使得相同的密码在不同的系统中生成不同的摘要值,进一步提高密码的安全性。
消息摘要算法主要有以下几种:
MD5(Message-Digest Algorithm 5)即消息摘要算法第五版,是一种被广泛使用的密码散列函数。输出长度为 128 位,计算速度快。曾经广泛用于文件校验、数字签名等。但由于其安全性逐渐被破解,现在已不建议在安全要求高的场景中使用。
SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,它可以将任意长度的数据块转换为一个 160 位(20 字节)的哈希值。它是由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布的。曾经被认为是较为安全的算法,但现在也已被发现存在安全弱点。逐渐被更安全的算法取代,旧系统中可能仍有存在。
SHA-2(Secure Hash Algorithm 2)是一系列密码散列函数的统称,它是美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布的哈希算法标准。包括 SHA-224、SHA-256、SHA-384 和 SHA-512 等不同的变体,后面的数字代表了哈希值的长度(位)。具有较高的安全性和抗碰撞性,广泛应用于密码学、数字签名、数据完整性校验等领域。
SHA-3(Secure Hash Algorithm 3)是一种密码散列函数标准。它是在密码学界对哈希函数安全性担忧的背景下开发的,主要是为了提供一种与 SHA-2 不同的、抗量子计算攻击等新兴威胁的哈希算法。NIST(美国国家标准与技术研究院)在 2015 年发布了 SHA-3 作为新的哈希标准。
SHA-3 采用全新的海绵结构设计,具有更好的安全性和灵活性,有不同的输出长度可供选择。在新的安全敏感应用中逐渐得到推广。
RIPEMD(RACE Integrity Primitives Evaluation Message Digest)是一系列密码学哈希函数。它是在欧洲的 RACE(Research and Development in Advanced Communications Technologies in Europe)项目中开发的,主要用于提供数据完整性验证和数字签名等密码学应用中的消息摘要。
RIPEMD 有不同的输出长度版本,如 RIPEMD-128、RIPEMD-160 等,安全性相对较高,在一些特定的密码学应用中使用。
上述这些消息摘要算法在不同的历史时期和应用场景中发挥了重要作用,但随着密码学的发展,安全性更高的算法不断被推出和应用,部分算法也在逐渐被淘汰。