2.1单向散列函数
通过单向散列函数计算信息的指纹,通过验证指纹判断信息是否被篡改,即完整性,或称一致性。
什么是单向散列函数
单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数把输入作为纯粹的比特序列来处理。散列值的长度与消息的长度无关,单向散列函数总会计算出固定长度的散列值。
单向散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值
- 能够快速计算散列值
- 消息不同散列值也不同
- 难以发现碰撞的性质称为抗碰撞性
- 弱抗碰撞性:确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的
- 强抗碰撞性:确保要找到散列值相同的两条不同的信息是非常困难的
- 密码技术中使用的单向散列函数,这两种性质都需要具备
- 具备单向性
几个术语:
- 单向散列函数,又称消息摘要函数、哈希函数或杂凑函数
- 输入单向散列函数的消息也称为原像
- 单向散列函数输出的散列值也称为消息摘要或指纹
- 完整性,也称一致性
单向散列函数的应用
检测完整性、基于口令的加密、消息认证码、数字签名、伪随机数生成器、一次性口令
几种单向散列函数
- MD4/MD5
- SHA-1、SHA-2(SHA-256、SHA-384、SHA-512)
- SHA-1的强抗碰撞性已于2005年被攻破
- RIPEMD-160
- RIPEMD的强抗碰撞性已于2004年被攻破
- SHA-3
- 选拔,Keccak算法胜出
- Keccak算法 - 海绵结构 - 攻击
对单向散列函数的攻击
- 暴力破解
- 生日攻击
单向散列函数用于确认消息的完整性。但是单向散列函数无法辨别出“伪装”。为了解决这个问题,我们需要对消息进行认证。用于认证的技术包括消息验证码和数字签名。消息认证码能够向通信对象保证消息没有被篡改,而数字签名不仅能够像通信对象保证消息没有被篡改,还能向第三方保证。
2.2 消息认证码
消息认证码(Message Authentication Code)是一种确认消息完整性并进行认证的技术,简称MAC。其输入包括任意长度的信息和一个发送者与接受者间共享的密钥,输出固定长度的数据(MAC值)。消息认证码正是通过密钥来完成认证的。
消息认证码共享密钥也存在密钥配送问题。与对称密码一样,具体使用哪种方式配送,需要根据具体情况。
应用实例
- SWIFT
- IPsec
- SSL/TLS
实现方法
- 使用单向散列函数 HMAC
- 使用分组密码
- 其他:流密码和公钥密码
认证加密
认证加密(缩写AE或AEAD)是一种将对成密码与消息验证码相结合,同时满足机密性、完整性和认证三大功能的机制。Encrypt-then-MAC(先对明文加密,计算密文MAC值)、Encrypt-and-MAC(先对明文加密,并对明文计算MAC值)、MAC-then-Encrypt(先计算明文的MAC值,然后将明文和MAC值同时加密)。
- GCM和GMAC
对消息认证码的攻击
- 重放攻击
- 密钥推测攻击
消息认证码虽然可以保证消息的完整性并对消息来源进行认证,但是仍然有无法解决的问题。比如“对第三方证明”和“防止否认”。
2.3 数字签名
数字签名不仅可以识别篡改和伪装,还可以防止否认。数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法生成签名的。签名密钥只能由签名的人持有,而验证密钥是任何需要验证签名的人都可以持有。
- 用签名密钥进行签名
- 用验证密钥进行解密
数字签名的方法
- 直接对消息签名的方法(基本不会用)
- 对消息的散列值签名的方法
一些问题
- 数字签名并非为了保证机密性,而是利用了“没有私钥的人事实上无法生成利用该私钥生成的密文”这一性质。它仅代表一种只有持有该密钥才能生成的信息(认证符号)。
- 为了保证机密性,数字签名需要和密码组合使用。
- 签名可以被复制并不代表签名没有意义,重要的是特定的签名者与特定的消息绑定在了一起这一事实。
- 数字签名要实现的不是防止修改,而是识别修改。
- 同时修改消息和签名使得验证签名成功,这个事实上是做不到的;且消息不同签名也不同,不会存在重复签名。
- 数字签名真的可以代替签名吗?签名软件是否可信?美国于2000年颁布了E-SIGN法案,日本也于2001年颁布了电子签名及其认证业务的相关法律。
数字签名的应用
- 安全信息公告
- 软件下载
- 公钥证书(后续章节会详细介绍)
- SSL/TLS(后续章节会详细介绍)
通过RSA实现数字签名
用RSA生成签名:D和N就是签名者的私钥
用RSA验证签名:E和N就是签名者的公钥
其他数字签名
- EIGamal方式
- DSA
- ECDSA
- Rabin方式
对数字签名的攻击
- 中间人攻击
- 对单向散列函数的攻击
- 利用数字签名攻击公钥密码
- 潜在伪造
- 其他:暴力破解、对RAS的N进行质因数分解
数字签名既可以识别出篡改和伪装,还可以防止否认。也就是说,我们同时实现了确认消息完整性、认证以及防止否认。然而要正确地使用签名,一个大前提是用于验证签名的公钥必须属于真正的发送者。这个公钥的验证又必须经过证书——由可信的第三方对其签名后所得到的公钥。
问题是如何构筑一个可信的数字签名链条呢?又由谁来颁发可信的证书呢?
我们需要让公钥和数字签名技术成为一个社会性的基础设施,即公钥基础设施(Public Key Infrastructure,PKI)。