Python3.9 hashlib --Md5和Sha哈希算法

使用 hashlib 标准库实现 md5sha 哈希算法的一些例子

Md5

Md5 密文是字母 a-f 和数字 0-9 混合,字母全部大写或全部小写,固定位数 1632

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import hashlib


def md5_test1():
data = b'abc123' # 只能是 bytes 类型
hash_obj = hashlib.md5() # 构造一个哈希对象
hash_obj.update(data) # 更新哈希对象
hexdigest = hash_obj.hexdigest() # 返回字符串形式的十六进制数码
print(f'{len(hexdigest)}{hexdigest}')


def md5_test2():
'''
重复调用 update() 相当于单次调用并传入所有参数的拼接结果:
>>>m.update(a)
>>>m.update(b)
等价于
>>>m.update(a+b)
'''
data1 = b'abc'
data2 = b'123'
hash_obj = hashlib.md5()
hash_obj.update(data1)
hash_obj.update(data2)
hexdigest = hash_obj.hexdigest()
print(f'{len(hexdigest)}{hexdigest}')


def md5_test3():
'''
更简要的写法
'''
data = b'abc123'
hash_obj = hashlib.md5(data)
hexdigest = hash_obj.hexdigest()
print(f'{len(hexdigest)}{hexdigest}')


def md5_test4():
'''
使用 new(name, [data, ]*, usedforsecurity=True) 构造器
'''
data = b'abc123'
hash_obj = hashlib.new('md5') # 传入哈希算法小写名称
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'{len(hexdigest)}{hexdigest}')


def md5_test5():
'''
如果加密原文是中文字符,则不能加 b 前缀了,需使用 encode 编码
'''
data = '雨园博客'.encode('utf-8')
hash_obj = hashlib.md5(data)
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'{len(hexdigest)}{hexdigest}')


md5_test1()
md5_test2()
md5_test3()
md5_test4()
md5_test5()

输出

1
2
3
4
5
32位 e99a18c428cb38d5f260853678922e03
32位 e99a18c428cb38d5f260853678922e03
32位 e99a18c428cb38d5f260853678922e03
32位 e99a18c428cb38d5f260853678922e03
32位 caabf06321c1ad150952d91bd76cfa5f

Sha

Sha 算法是一个家族:

  • sha1:字母 a-f 和数字 0-9 混合,固定位数 40
  • sha224/sha3_224:字母 a-f 和数字 0-9 混合,固定位数 56
  • sha256/sha3_256:字母 a-f 和数字 0-9 混合,固定位数 64
  • sha384/sha3_384:字母 a-f 和数字 0-9 混合,固定位数 96
  • sha512/sha3_512:字母 a-f 和数字 0-9 混合,固定位数 128

用法与 md5 类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import hashlib


data = b'abc123' # 只能是 bytes 类型


def sha1():
hash_obj = hashlib.sha1()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha1:{len(hexdigest)}{hexdigest}')


def sha224():
hash_obj = hashlib.sha224()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha224:{len(hexdigest)}{hexdigest}')


def sha256():
hash_obj = hashlib.sha256()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha256:{len(hexdigest)}{hexdigest}')


def sha384():
hash_obj = hashlib.sha384()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha384:{len(hexdigest)}{hexdigest}')


def sha512():
hash_obj = hashlib.sha512()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha512:{len(hexdigest)}{hexdigest}')


def sha3_224():
hash_obj = hashlib.sha3_224()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha3_224:{len(hexdigest)}{hexdigest}')


def sha3_256():
hash_obj = hashlib.sha3_256()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha3_256:{len(hexdigest)}{hexdigest}')


def sha3_384():
hash_obj = hashlib.sha3_384()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha3_384:{len(hexdigest)}{hexdigest}')


def sha3_512():
hash_obj = hashlib.sha3_512()
hash_obj.update(data)
hexdigest = hash_obj.hexdigest()
print(f'sha3_512:{len(hexdigest)}{hexdigest}')


sha1()
sha224()
sha256()
sha384()
sha512()
sha3_224()
sha3_256()
sha3_384()
sha3_512()

输出

1
2
3
4
5
6
7
8
9
sha1:40位 6367c48dd193d56ea7b0baad25b19455e529f5ee
sha224:56位 5c69bb695cc29b93d655e1a4bb5656cda624080d686f74477ea09349
sha256:64位 6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
sha384:96位 a31d79891919cad24f3264479d76884f581bee32e86778373db3a124de975dd86a40fc7f399b331133b281ab4b11a6ca
sha512:128位 c70b5dd9ebfb6f51d09d4132b7170c9d20750a7852f00680f65658f0310e810056e6763c34c9a00b0e940076f54495c169fc2302cceb312039271c43469507dc
sha3_224:56位 026727ec105a060b02a0086a2181748f6b9ac3cea3fc347ca8675984
sha3_256:64位 f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee
sha3_384:96位 e07300227b15a724fdf6555569e38282022d106d778aa2268898dc21639b24e1e00fcc0a6d96ffc8b3a97c7fa7296305
sha3_512:128位 3274f8455be84b8c7d79f9bd93e6c8520d13f6bd2855f3bb9c006ca9f3cce25d4b924d0370f8af4e27a350fd2baeef58bc37e0f4e4a403fe64c98017fa012757

官方资料