消息摘要
把一段文本或一个文件用单向hash函数得到一段字符串(或文件),这段字符串(或文件)就是消息摘要(Message Digest),单向hash函数也叫消息摘要算法或散列算法。
如果文本或文件发生了变化,消息摘要也会变化,因此消息摘要可以用于判断文本或文件有没有被修改。
消息摘要有可能发生碰撞(即不同的文本/文件产生了一样的摘要),但概率极低。
常见的消息摘要算法有:
MD5(Message-Digest Algorithm 5),可以生成128位(16字节)的散列值,
SHA-1(Secure Hash Algorithm 1),可以生成160位(20字节)的散列值,
SHA系列除了SHA-1,还有SHA256(256位)、SHA384(384位)、SHA512(512位)等,
消息摘要长度越长,碰撞概率越低,但是计算速度也越慢。
数字签名
理解数字签名前,需要先理解非对称加密的两种应用场景
数字签名=私钥+消息摘要
消息摘要可以保证消息没有被篡改,但是不能保证消息发送方是可信任的。
消息发送者A要发送消息给消息接收者B,流程如下
1.A使用消息摘要算法对消息计算消息摘要M1,然后用A的私钥对M1加密,得到签名;
2.A用B的公钥对消息明文和签名加密,把加密后的消息明文和签名发给B;
3.B用B的私钥对密文解密,得到明文和签名,对明文使用同样的消息摘要算法计算出消息摘要M2;
4.B用A的公钥对签名解密,得到消息摘要M1,这里用A的公钥解密成功,可以证明消息发送方可信任,因为只有可信任的消息发送方有A的私钥;
5.B对比M1和M2,如果一致,说明消息没有被篡改。