摘要算法又称哈希算法、散列算法。
原理及作用:
它可以把任意长度的数据转换为一个长度固定且唯一(不同数据的加密结果重复概率极低,有兴趣请阅读https://blog.csdn.net/skyMountain/article/details/532819)的数据串(通常用16进制的字符串表示),从而到达验证数据是否被人篡改的作用。(简单来说就是验证数据的完整性)
分类:
消息摘要算法分为三类:
MD(Message Digest):消息摘要
SHA(Secure Hash Algorithm):安全散列
MAC(Message Authentication Code):消息认证码
MD算法
算法 | 摘要长度 | 实现方 |
MD2 | 128 | JDK |
MD4 | 128 | Bouncy Castle |
MD5 | 128 | JDK |
SHA算法:
算法 | 摘要长度 | 实现方 |
SHA-1 | 160 | JDK |
SHA-224 | 224 | Bouncy Castle |
SHA-256 | 256 | JDK |
SHA-384 | 384 | JDK |
SHA-512 | 512 | JDK |
使用场景:
1.常用对注册用户的密码进行加密存储,提高了用户信息的安全性,如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中
2.web api调用认证中,客户端和服务端通过相同的公钥对提交参数进行MD5加密,进行验证
3.不同用户之间进行数据交互可以通过摘要算法进行加密,已确保传输的数据没有被他人篡改
用法示例:
Python中的hashlib模块封装一些常用摘要算法,如md5、sha1等
md5的使用
import hashlib
md5 = hashlib.md5()
md5.update('md5test: i am Chinese'.encode('utf-8'))
print(md5.hexdigest())
如果需要验证的数据量较大可以分多次计算,结果一样
import hashlib
md5 = hashlib.md5()
md5.update('md5test: '.encode('utf-8'))
md5.update('i am Chinese'.encode('utf-8'))
print(md5.hexdigest())
sha1的使用同上
import hashlib
sha1 = hashlib.sha1()
sha1.update('sha1test: i am chinese'.encode('utf-8'))
print(sha1.hexdigest())
import hashlib
sha1 = hashlib.sha1()
sha1.update('sha1test: '.encode('utf-8'))
sha1.update('i am chinese'.encode('utf-8'))
print(sha1.hexdigest())
注意
最后需要知道摘要算法不是对数据进行加密,也不是对数据进行编码。加密和编码都是可逆的,而摘要算法对数据的处理几乎是不可逆的。