单向加密算法,又称哈希函数、散列函数、杂凑函数、摘要算法,英文名One-way encryption algorithm
。
单向加密如其名只能加密不能解密(彩虹表攻击不能算是正经的解密方式),不能解密的原因是本质上并不是用IV(Initial Vector)
去加密M
输出M
的密文,而是用M
去加密IV
输出IV
的密文。
用途:消息认证摘要、内容或文档的数字指纹、口令存储。
单向加密又可以分为hash
和hmac
两大类,hmac
和hash
的算法是一样的,其实可以认为hmac
就是hash
加盐的形式(不过这盐值不是hash
中常用的拼接在最前边或拼接在最后边,具体怎么拼接的我不太确定)。
一般来说标准库就挺好用时我们一般就直接用标准库,python
的标准库就能容易地实现单向加密算法,所以单向加密我们使用标准库实现。
python
中hash
类算法使用hashlib
库实现,hmac
类算法使用hmac
库实现。
标准库支持的单向加密算法
import hashlib # 注意输出结果中各算法使用大写和小写写了两遍
# 同时也是说到后边的书写中算法名大写或小写都是可以的
hashlib.algorithms_available
使用hashlib实现hash算法(以md5为例)
import hashlib
# 实例化方法一,直接使用算法名;这种形式不完全支持hashlib.algorithms_available中的算法
# m = hashlib.md5()
# 实例化方法二,使用new方法;所有支持的算法名看上边hashlib.algorithms_available
m = hashlib.new("md5")
# update内是要加密的内容
# update使用+=,即连续多次update表示在原先内容上追加而不是替换
m.update(b"123456")
# 以十六进制字符串形式输出
m.hexdigest()
使用hmac实现hmac算法(以sha1为例)
import hmac
# 实例化原形是hmac.new(key, msg=None, digestmod=None)
# key--加密用的盐值
# msg--要加密码的内容,可为空而后用update方法设置
# digestmod--加密算法,默认为md5,所有支持的算法名看上边hashlib.algorithms_available
m = hmac.new(b"123",digestmod="sha1")
# update使用+=,即连续多次update表示在原先内容上追加而不是替换
# 但要注意所谓的+=是msg之间的+=,而不是key和msg之间的+=
# 即使用以下update后等价于hmac.new(b"123",b"123456", digestmod="sha1"),而不是hmac.new(b"123123456", digestmod="sha1")
m.update(b"123456")
# 以十六进制字符串形式输出
m.hexdigest()
ps:除了标准库,
python
三方库pycryptodome
提供了更加完备的加密方式,包括对称加密和非对称加密
网友评论