使用 hashlib 标准库实现 md5 和 sha 哈希算法的一些例子
Md5
Md5 密文是字母 a-f 和数字 0-9 混合,字母全部大写或全部小写,固定位数 16 或 32 位
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' 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'
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
|
官方资料