0%

浅谈密码学之哈希函数、消息认证码、数字签名

这里介绍哈希函数、消息认证码、数字签名等密码学技术

abstract.png

Cryptographic Hash Function 密码学哈希函数

Hash哈希函数的概念对于开发者来说并不陌生。但在密码学中,哈希函数还有着更重要的价值——防篡改。即Cryptographic Hash Function密码学哈希函数可以保障信息的完整性,即防篡改。但无法提供身份认证、不可否认性。为此对于Cryptographic Hash Function密码学哈希函数而言,其需要满足下述特性:

  1. 输入可变/输出固定:哈希函数的输入为任意长度的数据,而哈希函数的输出则为固定长度的哈希值。在密码学中,通常将哈希函数的输出称之为Message Digest消息摘要Fingerprint指纹
  2. 随机性:输出应该是随机的。即使输入非常相似,输出也应有很高的概率产生不同的哈希值
  3. 高效:对于大量数据输入,依然能够快速计算
  4. 单向性:无法通过输出的哈希值逆推、还原出原始的输入。即所谓的抗原像攻击。正因为如此,不能将密码学哈希函数称之为加密算法
  5. 抗碰撞性:对于不同的输入,找到两个输入使得它们的哈希值相同(即发生碰撞)。在现实世界条件下是不可行的

关于抗碰撞性这点来说,具体可分为:Weak Collision Resistance 弱抗碰撞性、Strong Collision Resistance 强抗碰撞性

  • Weak Collision Resistance 弱抗碰撞性:也称为第二原像抗性。是指对于一个给定的输入x,找到另一个不同的输入x’,使得哈希函数H对两者的输出相同。即,H(x) = H(x’)。在现实世界条件下是不可行的。即所谓的抗第二原像攻击
  • Strong Collision Resistance 强抗碰撞性:指对于一个哈希函数H,找到任意两个不同的输入x和x’,使得 H(x) = H(x’)。在现实世界条件下是不可行的

显然,强抗碰撞性的要求是高于弱抗碰撞性的。因为,前者不仅要求对于一个特定的输入,无法找到能够产生相同哈希值的另一个不同输入;其还要求无法找到任何一对不同的输入,使之具有相同的哈希值。当然这里的无法找到,指的是在现实世界条件下不可行的、无法实现的。例如,计算耗时达到几百万年等。故密码学哈希函数的弱抗碰撞性是一个基本要求

常见的密码学哈希函数有:

  • MD4算法:即Message Digest Algorithm 4算法。其会产生128位(16字节)的哈希值。目前已不安全,不应使用
  • MD5算法:即Message Digest Algorithm 5算法。作为MD4算法的替代品。其同样会产生128位(16字节)的哈希值。目前MD5算法的强抗碰撞性已被攻破
  • SHA-1算法:即Secure Hash Algorithm 1算法。其产生160位(20字节)的哈希值。目前SHA-1算法的强抗碰撞性已被攻破,不应使用
  • SHA-2算法:即Secure Hash Algorithm 2算法。该算法存在多个变种:
    1. SHA-224算法:产生224位的哈希值。其是将SHA-256算法结果进行截断的版本
    2. SHA-256算法:产生256位的哈希值
    3. SHA-384算法:产生384位的哈希值。其是将SHA-512算法结果进行截断的版本
    4. SHA-512算法:产生512位的哈希值
    5. SHA-512/224算法:产生224位的哈希值。其是将SHA-512算法结果进行截断的版本
    6. SHA-512/256算法:产生256位的哈希值。其是将SHA-512算法结果进行截断的版本
  • SHA-3算法:即Secure Hash Algorithm 3算法。目前SHA-3算法被认为是非常安全的,推荐使用

Cryptographic Hash Function密码学哈希函数的典型应用场景有:

  • 文件/数据的完整性校验,即防篡改
  • 用户密码存储
  • MAC消息认证码
  • 数字签名
  • 随机数生成

MAC 消息认证码

MAC(Message Authentication Code)消息认证码是一种结合了密钥、Cryptographic Hash Function密码学哈希函数的技术。其不仅保障了信息的完整性,还提供了通信双方间的身份认证的功能,但无法提供不可否认性。简单来说,就是将密钥和消息作为哈希函数的输入,则哈希函数输出的哈希值即为所谓的MAC值。具体地:

  1. 发送者 与 接收者 事先共享了同一个密钥
  2. 发送者利用密钥、消息计算出一个MAC值
  3. 发送者将消息、MAC值同时发送给接收者
  4. 接收者收到发送者发送的消息、MAC值
  5. 接收者利用密钥、收到的消息计算出一个MAC值
  6. 接收者将 第5步自己计算得到的MAC值 与 第4步自己收到的MAC值 进行对比,如果两者一致则说明认证成功;防止认证失败

显然上述过程中的第1步,通信双方如何安全地共享密钥,是个大问题。即所谓的密钥配送问题。解决方案有:Diffie-Hellman密钥交换协议、非对称加密算法等

消息认证码MAC的常见实现方式有:

  • HMAC算法:即Hash-based Message Authentication Code算法,一种基于哈希函数的MAC算法。常见的版本有:使用MD-5哈希函数的HMAC-MD-5算法、使用SHA-256哈希函数的HMAC-SHA-256算法
  • CMAC算法:即Cipher-based Message Authentication Code算法,一种基于分组对称加密算法的MAC算法。常见的版本有:使用DES算法的DES-CMAC算法、使用AES算法的AES-CMAC算法

Digital Signature 数字签名

MAC消息认证码的局限性在于,虽然提供了完整性通信双方间的身份认证的功能,但却无法防止否认。因为通信双方都共同持有了相同的密钥,其中一方A可以否认自己曾经给对方B发送了某条消息。因为对方B自己也持有了该密钥,故这条消息也有可能是B自己写的,并通过密钥自己计算出MAC值。故这里解释说明下:为什么MAC消息认证码的认证功能,仅限于对通信双方。故当通信的参与方大于两人时,由于多个人共同持有该密钥,故此时显然无法提供身份认证能力;其次,即使通信参与方只有A、B两人时,A也无法向第三方C(其不持有密钥)证明他收到的某条消息一定是B发给他的。原因很简单,因为这条消息也有可能是他自己发给自己的

而Digital Signature数字签名则一方面可保障信息的完整性,同时还提供提供身份认证不可否认性的功能。通过使用私钥生成签名,使用公钥验证签名。数字签名的基本原理在于:私钥加密的消息,只能通过相应的公钥才能解密。具体地:

  1. 消息发送者 提前生成一对私钥、公钥。同时将公钥对外公布,以便消息的接收者可以拿到该公钥
  2. 消息发送者 使用第1步生成的私钥直接对消息进行加密,来生成签名
  3. 消息发送者 将消息明文、签名一起发送给消息接收者
  4. 消息接收者 收到消息发送者发送的消息明文、签名
  5. 消息接收者 对第4步收到的签名进行验证。具体地:利用第1步得到的公钥对签名进行解密,然后将解密后的消息与第4步收到的消息进行对比。如果一致,则说明签名验证成功;反之:验签失败

考虑当消息内容很长时,直接对消息原文进行签名会非常慢。故我们还可以对消息的哈希值进行签名。具体地,消息发送者先通过哈希函数对消息原文计算一个哈希值。然后使用私钥对该哈希值进行加密,生成签名。验签时,消息接收者先将收到的消息通过相同哈希函数计算得到哈希值,再利用得到的公钥进行解密,最后只需将 自己计算得到的哈希值 与 解密后的哈希值 进行对比即可

不得看出,整个过程中由于只有消息发送者自己持有私钥,故数字签名提供了提供身份认证不可否认性的功能。而且,即使消息在通信链路中被第三方进行修改,消息接收者也能通过验签失败来识别、发现。故数字签名保证了消息的完整性

但数字签名和非对称加密算法一样,都存在一个相同的问题——存在被中间人攻击的风险。即如何在上述过程的第1步中,消息接收者如何确认得到的公钥是真正属于消息发送者的?解决方案是Public Key Certificate公钥证书(PKC) 。公钥证书是一个包含公钥、公钥拥有者的相关信息,并由 Certificate Authority认证机构(CA) 进行数字签名的文件。下图介绍了如何通过公钥证书来保证公钥的合法性

figure 1.png

Digital Signature 数字签名的常见算法有:

  • DSA算法:即Digital Signature Algorithm算法。一种基于离散对数问题的签名算法。鉴于其安全性、性能等方面落后于RSA、ECDSA等算法,故OpenSSH计划于2025年停止对该算法的支持。不推荐使用
  • RSA算法:RSA作为一种目前广泛使用的算法,其不仅可用于加密,还可以用于签名。推荐使用
  • ECDSA算法:即Elliptic Curve Digital Signature Algorithm算法。其是一种基于ECC椭圆曲线加密算法的签名算法。相对于RSA算法,其效率更高。推荐使用

参考文献

  1. 图解密码技术·第3版 [日]结城浩著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝