hashlib模块1. 封装一些用于加密的类:2. 加密的目的3. 特点4. 加密的使用4.1 加密的步骤4.2 md5加密方法4.3 sha1加密方法4.4 sha224加密方法4.5 sha384加密方法4.6 sha512加密方法4.7 sha3_224加密方法4.8 sha3_256加密方法4.9 sha3_384加密方法4.10 sha3_512加密方法4.11 创建加密对象时可以指定参数,称为salt5. 加密的作用6. 加密方法的区别7. 一个综合利用的小例子
1. 封装一些用于加密的类:
'md5', 'pbkdf2_hmac', 'scrypt', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256'
2. 加密的目的
用于判断和验证,并非用于解密
3. 特点
-
把一个大的数据,切分成不同的块进行加密,再汇总的结果,与直接对整体数据加密的结果是一致的
1 """切片加密再汇总与直接整体加密结果一致""" 2 import hashlib 3 4 # 将abcdef切片为abc和def加密 5 m = hashlib.md5() 6 m.update(b'abc') 7 m.update(b'def') 8 9 # 直接将abcdef整体加密 10 n = hashlib.md5() 11 n.update(b'abcdef') 12 13 print(m.hexdigest()) 14 print(n.hexdigest()) 15 # 输出结果一致 16 e80b5017098950fc58aad83c8c14978e 17 e80b5017098950fc58aad83c8c14978e
-
单向加密,不可逆
-
原始数据的一点小的变化,将导致结果的非常大的差异 - 雪崩效应
1 import hashlib 2 3 # 获取一个md5加密对象 4 m = hashlib.md5() 5 m.update(b'abc') 6 7 n = hashlib.md5() 8 n.update(b'ab c') # 包含一个空格 9 10 print(m.hexdigest()) 11 print(n.hexdigest()) 12 # 输出结果 - 相差很大 13 900150983cd24fb0d6963f7d28e17f72 14 7f1f06c08b5de8a0c856f4baa7b2e6d0
4. 加密的使用
4.1 加密的步骤
-
获取一个加密对象
-
使用加密对象的update()方法进行加密,该方法可以调用多次
-
通常使用hexdigest()方法获取加密结果;或者digest()方法获取二进制的字节串结果
4.2 md5加密方法
1 """md5加密方法""" 2 import hashlib 3 4 # 获取一个md5加密对象 5 m = hashlib.md5() 6 # 使用update()进行加密 - 必须是byte类型的数据 7 m.update(b'abc') # b'abc' - 将字符串abc转换成字节类型 8 # 对于字符串中的中文处理 9 m.update('abc中文'.encode('utf-8')) 10 # 通过hexdigest()获取加密的结果 11 res = m.hexdigest() 12 print(res) 13 bb33ac3c7ccefffd55fabfd949dd8d49 # 输出的是字符串 14 # 通过digest()方法获取二进制的字节串结果 15 res1 = m.digest() 16 print(res1) 17 b'\xbb3\xac<|\xce\xff\xfdU\xfa\xbf\xd9I\xdd\x8dI' # 输出的是二进制的字节串 18 print(len(res)) 19 32
4.3 sha1加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha_1 = hashlib.sha1() 5 # 对abc进行加密 6 sha_1.update(b'abc') 7 # 获取加密结果 8 res = sha_1.hexdigest() 9 print(res) 10 a9993e364706816aba3e25717850c26c9cd0d89d 11 print(len(res)) 12 40
4.4 sha224加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha_224 = hashlib.sha224() 5 # 对abc进行加密 6 sha_224.update(b'abc') 7 # 获取加密结果 8 res = sha_224.hexdigest() 9 print(res) 10 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 11 print(len(res)) 12 56
4.5 sha384加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha_384 = hashlib.sha384() 5 # 对abc进行加密 6 sha_384.update(b'abc') 7 # 获取加密结果 8 res = sha_384.hexdigest() 9 print(res) 10 cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 11 print(len(res)) 12 96
4.6 sha512加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha_512 = hashlib.sha512() 5 # 对abc进行加密 6 sha_512.update(b'abc') 7 # 获取加密结果 8 res = sha_512.hexdigest() 9 print(res) 10 ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f 11 print(len(res)) 12 128
4.7 sha3_224加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha3_224 = hashlib.sha3_224() 5 # 对abc进行加密 6 sha3_224.update(b'abc') 7 # 获取加密结果 8 res = sha3_224.hexdigest() 9 print(res) 10 e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf 11 print(len(res)) 12 56
4.8 sha3_256加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha3_256 = hashlib.sha3_256() 5 # 对abc进行加密 6 sha3_256.update(b'abc') 7 # 获取加密结果 8 res = sha3_256.hexdigest() 9 print(res) 10 3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532 11 print(len(res)) 12 64
4.9 sha3_384加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha3_384 = hashlib.sha3_384() 5 # 对abc进行加密 6 sha3_384.update(b'abc') 7 # 获取加密结果 8 res = sha3_384.hexdigest() 9 print(res) 10 ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25 11 print(len(res)) 12 96
4.10 sha3_512加密方法
1 import hashlib 2 3 # 获取加密对象 4 sha3_512 = hashlib.sha3_512() 5 # 对abc进行加密 6 sha3_512.update(b'abc') 7 # 获取加密结果 8 res = sha3_512.hexdigest() 9 print(res) 10 b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0 11 print(len(res)) 12 128
4.11 创建加密对象时可以指定参数,称为salt
1 """md5加密方法""" 2 import hashlib 3 4 # 获取一个md5加密对象 5 m = hashlib.md5() 6 n = hashlib.md5(b'abc') # 获取加密对象时指定参数salt 7 # 使用update()进行加密 - 必须是byte类型的数据 8 m.update(b'abc') # b'abc' - 将字符串abc转换成字节类型 9 res_m = m.hexdigest() 10 print(res_m) 11 print(len(res_m)) 12 res_n = n.hexdigest() 13 print(res_n) 14 print(len(res_n)) 15 # 输出结果是一致的 16 900150983cd24fb0d6963f7d28e17f72 17 32 18 900150983cd24fb0d6963f7d28e17f72 19 32
5. 加密的作用
主要用于加密和验证
-
加密:给一个数据加密
-
验证:用另一个数据加密的结果和第一次加密的结果对比,若结果相同,说明原文相同;若结果不同,则原文不同
6. 加密方法的区别
上述各加密方法的区别主要在于加密结果的长度不同
一位16进制的字节对应4位的二进制字节(1:4)
所以各加密方法长度与二进制位的对应关系如下: 进制加密长度位进制加密长度位
| 加密方法 | 16进制加密长度(bit位) | 2进制加密长度(bit位) |
|---|---|---|
| md5 | 32 | 128 |
| sha1 | 40 | 160 |
| sha224 | 56 | 224 |
| sha256 | 64 | 256 |
| sha384 | 96 | 384 |
| sha512 | 128 | 512 |
| sha3_224 | 56 | 224 |
| sha3_256 | 64 | 256 |
| sha3_384 | 96 | 384 |
| sha3_512 | 128 | 512 |
7. 一个综合利用的小例子
1 """hashlib加密验证的小例子 2 实现如下功能: 3 注册、登录、验证用户名和密码 4 """ 5 import hashlib 6 7 8 # md5加密功能 9 def get_md5(user_name, pass_word): 10 """md5加密功能""" 11 # 获取加密对象 12 m = hashlib.md5() 13 m.update(user_name.encode('utf-8')) 14 m.update(pass_word.encode('utf-8')) 15 return m.hexdigest() 16 17 18 # 注册功能 19 def register(): 20 """注册功能""" 21 # 输入用户名和密码 22 user_name = input('请输入用户名: ').strip() 23 pass_word = input('请输入密码: ').strip() 24 # 加密 25 res = get_md5(user_name, pass_word) 26 # 将加密的信息(字符串)保存到文件login 27 with open('login', mode='at', encoding='utf-8') as f: 28 f.write(res) 29 f.write('\n') 30 return True, f'用户[{user_name.title()}]注册成功!' 31 32 33 # 登录功能 34 def login(): 35 """登录功能""" 36 # 输入当前要登录的用户名和密码 37 user_name = input('请输入用户名: ').strip() 38 pass_word = input('请输入密码: ').strip() 39 # 加密当前登录的用户名和密码 40 res = get_md5(user_name, pass_word) 41 # 读取文件login中保存的信息与res进行对比 42 with open('login', mode='rt', encoding='utf-8') as f: 43 for line in f: 44 if res == line.strip(): 45 return True, f'用户[{user_name.title()}]登录成功!' 46 else: 47 return False, f'用户[{user_name.title()}]不存在!' 48 49 50 # 退出程序 51 def quit_program(): 52 """退出程序""" 53 quit() 54 55 56 # 函数功能字典 57 func_dic = { 58 '1': register, 59 '2': login, 60 '3': quit_program, 61 } 62 63 # 打印选择菜单 64 print(""" 65 ======== 功能菜单 ======== 66 1.注册 67 2.登录 68 3.退出 69 ========== END ========== 70 """) 71 72 # 主循环 - 程序入口 73 while True: 74 # 用户选择相应的功能 75 choice = input('请输入功能编号: ').strip() 76 if choice not in func_dic: 77 print('请输入正确的功能编号!') 78 continue 79 flag, msg = func_dic.get(choice)() 80 if flag: 81 print(msg) 82 else: 83 print(msg)