Python加密模块

Python中的hashlib和hmac加密模块都是内置模块,可以方便的进行字符串加密,这些加密都是单向的,加密后的字符串不可反解成原字符串。但是由于某个固定的字符串使用某个固定的算法得出的加密串是固定的,所以有通过撞库来反解出密码的危险

Python Version: 3.5+

hashlib模块

md5

hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import hashlib

# md5
# 创建md5对象
hash = hashlib.md5()
# update方法接收一个字节类型的数据是Python3+中的强制要求
hash.update(bytes('polarsnow', encoding='utf8'))
# 返回一个十六进制的字符串
print(hash.hexdigest())
# 返回一个二进制的字符串
print(hash.digest())

------------
72c5c8f4fcfeb39c1ebce3be56ebb9f8
b'r\xc5\xc8\xf4\xfc\xfe\xb3\x9c\x1e\xbc\xe3\xbeV\xeb\xb9\xf8'

sha1

1
2
3
4
5
6
7
8
9
10
11
import hashlib

# sha1
# 创建sha1对象
hash = hashlib.sha1()
# 按照指定的字符编码加密字符串
hash.update(bytes('polarsnow', encoding='utf8'))
print(hash.hexdigest())

------------
299a06d4672c5a57facee0cf132593132084a3c0

sha256

1
2
3
4
5
6
7
8
9
import hashlib

# sha256
hash = hashlib.sha256()
hash.update(bytes('polarsnow', encoding='utf8'))
print(hash.hexdigest())

------------
f379eefa6d3a0447d807d679dbd02f0593e8b3c3377da53dd909d98b4dcac9ad

sha384

1
2
3
4
5
6
7
8
9
import hashlib

# sha384
hash = hashlib.sha384()
hash.update(bytes('polarsnow', encoding='utf8'))
print(hash.hexdigest())

------------
768e16e89a691905e7e2413fc67ba2846a39a3d2dd064a7930eb54c36e58a2694b5bf57ca7bb52cea0ad33feaf718ad6

sha512

1
2
3
4
5
6
7
8
9
import hashlib

# sha512
hash = hashlib.sha512()
hash.update(bytes('polarsnow', encoding='utf8'))
print(hash.hexdigest())

------------
ef510ae0c752261359b87e8260b1a8d90a1d9bc373fd5a107e091e9340d60877909b1e7996c32ecb5a571378815aa524e284a65d7d91d33b8fe29f1376ff048e

自定义key加密

上面的加密算法虽然已经足够强大,但是还是存在缺陷,即可以通过撞库反解密码。所以,有必要对加密算法中添加自定义key再来做加密。

1
2
3
4
5
6
7
8
9
10
import hashlib

# md5
hash = hashlib.md5(bytes('9ol4rfv', encoding='utf8'))
hash.update(bytes('polarsnow', encoding='utf8'))
# 返回一个十六进制的字符串
print(hash.hexdigest()

------------
6e4257d3855aaf563ce5c8d499156137

hmac模块

hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密

1
2
3
4
5
6
7
8
import hmac

h = hmac.new(bytes('9ol4rfv', encoding="utf-8"))
h.update(bytes('polarsnow', encoding="utf-8"))
print(h.hexdigest())

------------
2d7acf84247e563213d0ec8e325831ba