有名的加密库
hashlib库(安全哈希和消息摘要)
该模块实现了许多不同安全散列和消息摘要算法的通用接口。包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在Internet中定义)RFC 1321)。术语“安全散列”和“消息摘要”是可互换的。较旧的算法称为消息摘要。现代术语是安全散列。
- 注意
- 如果您需要adler32或crc32哈希函数,则它们在zlib模块中可用
- update()不支持将字符串对象引入,因为哈希在字节上工作,而不在字符上工作。
1
# binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式
2
import binascii
3
binascii.b2a_hex('南北'.encode())
4
binascii.a2b_hex(b'e58d97e58c97')
5
binascii.a2b_hex(b'e58d97e58c97').decode()
- 官网
- hashlib文档
1
// 支持的加密
2
sha1(),sha224(),sha256(),sha384(), sha512()
3
// (python3.6版本以)
4
blake2b(),和blake2s()
5
6
// 也支持MD5
7
md5()
8
9
// 大多数平台上也可提供(python3.6版本以上)
10
sha3_224(),sha3_256(),sha3_384(),sha3_512(), shake_128(),shake_256()
- 示例
1
'''
2
sha256原理
3
最终密码组成方式:pbkdf2:sha256:3648 + $ + 8位随机盐 + $ + 特殊处理后的暗文
4
特殊处理后的暗文步骤:
5
1.进行hmac转换处理
6
rv = hashlib.pbkdf2_hmac(sha256 + 原始密码 + 8位随机盐 + 后缀数字3648)
7
2.对hmac进行16进制转码
8
import codecs
9
code_rv = codecs.encode(rv, "hex_codec")
10
3.最终转换(bytes=>str)
11
code_rv.decode('utf-8', errors="strict")
12
eg:
13
原密(实际原密前端需要进行md5+盐进行暗文转换):
14
123456
15
转换后(同个密码每次转换后都不一样,但是最终在验证后是一致的):
16
pbkdf2:sha256:3648$mfECpIs5$137cd11c78e09aa9303726fa63c0f797e8634c462bce7f1e99e1467a9a4a8fe2
17
'''
18
def old_auth(self):
19
hash = hashlib.sha256()
20
hash.update(bytes('1234567654321', encoding="utf8"))
21
hash.update(b'0a7459dd4a27454a90eb93feff2f03e8')
22
sha256_password = hash.digest()
23
logger.info(sha256_password)
- hashlib文档
- 注意
base64库
该模块提供了关于Base16,Base32,Base64,Base85和Ascii85的编码和解码相关的函数
Base64
base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。
- base64 并不是用来加密数据,而是实现在文本协议中传递二进制内容
1
import base64
2
a = base64.b64encode('123456') # 编码
3
print (a)
4
print (base64.b64decode(a)) # 逆转
- 由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+和/分别变成-和_
1
base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
2
base64.urlsafe_b64decode('abcd--__')
- 注意
1
// 去了等号的需要添加=把长度变为4的倍数才能正常解码(Base64是把3个字节变为4个字节,所以Base64编码的长度永远是4的倍数)
2
由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉
- base64 并不是用来加密数据,而是实现在文本协议中传递二进制内容
werkzeug
PyCryptodome
PyCrypto是 Python 中密码学方面最有名的第三方软件包,提供了许多加密算法的使用。可惜的是,它的开发工作于2012年就已停止。幸运的是,有一个该项目的分支PyCrytodome 取代了 PyCrypto 。
1
2
import Crypto
常见的加密方式
各种加密方式的实现都能在python中找到对应的库实现
URL编码(urllib库)
正常的URL中是只能包含ASCII字符的,也就是字符、数字和一些符号。而URL编码就是一种浏览器用来避免url中出现特殊字符(如汉字)的编码方式。其实就是将超出ASCII范围的字符转换成带%的十六进制格式。
1
>>> from urllib import parse
2
>>> parse.quote('胖')
3
'%E8%83%96'
4
>>> parse.unquote('%E8%83%96')
5
'胖'
6
7
- Base64(base64库)
8
> 见上面的base64库介绍
9
10
- MD5(hashlib库)
11
> message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是信息摘要算法。md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。详见上面hashlib库的使用。
12
13
```python
14
import hashlib
15
hl = hashlib.md5()
16
hl.update(str.encode(encoding='utf-8'))
17
print (hl.hexdigest())
RSA
Diffie-Hellman
AES
DES
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
Hmac(hashlib库)
Hmac算法也是一种哈希算法,它可以利用MD5或SHA1等哈希算法。不同的是,Hmac还需要一个密钥