摘要算法
又称哈希算法、hash、digest、数字指纹
- 计算任意长度数据的摘要(固定长度)
- 相同的输入数据始终得到相同的输出
- 不同的输入数据尽可能得到不同的输出
目的
验证原始数据是否被篡改
java的Object.hashCode()方法就是一个摘要算法:
- 输入:任意数据
- 输出:固定长度数据(int类型)
- 相同输入得到相同输出
碰撞
两个不同的输入得到了相同的输出
碰撞不能避免,因为输出的长度是固定的,但输入的长度是不固定的
安全性
一个好的hash算法应该:
- 碰撞率低
- 不能猜测输出
- 输入的任意一个bit的变化会造成输出完全不同
- 很难从输出反推输入(只能依靠穷举)
常见算法
算法 | 输出长度 |
---|---|
MD5 | 128bits(16bytes) |
SHA-1 | 160bits(20bytes) |
SHA-256 | 256bits(32bytes) |
RipeMD-160 | 160bits(20bytes) |