摘要算法
python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
摘要算法又稱哈希算法,散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
摘要算法就是通過摘要函數 f() 對任意長度的數據 date計算出固定長度的摘要 digest,目的是為了發現原始數據是否被人篡改過。
我們以常見的摘要算法MD5為例,計算出一個字符串的MD5值:

1 import hashlib 2 3 md5 = hashlib.md5() 4 md5.update('how to user md5 in python hashlib?'.encode('utf-8')) 5 print(md5.hexdigest())
計算結果如下:
4c850bdab2e3c34df385a2a228d2ea04
如果數據量很大,可以分多次調用 update() ,最后的計算結果都是一樣的:

1 import hashlib 2 3 md5 = hashlib.md5() 4 md5.update('how to user md5 in '.encode('utf-8')) 5 md5.update('python hashlib?'.encode('utf-8')) 6 print(md5.hexdigest())
計算結果:
4c850bdab2e3c34df385a2a228d2ea04
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。
另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似:

1 import hashlib 2 3 sha1 = hashlib.sha1() 4 sha1.update('how to learning english?'.encode('utf-8')) 5 print(sha1.hexdigest())
計算結果如下:
983b7e0be6b6d65fabf86149183c428da685d4a5
SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示。
由於常用口令的MD5值很容易被計算出來,所以,要確保存儲的用戶口令不是那些已經被計算出來的常用口令的MD5,這一方法通過對原始口令加一個復雜字符串來實現,俗稱“加鹽”:
應用:

1 import hashlib #導入模塊 2 3 def get_md5(date): 4 obj = hashlib.md5('iuqe832643873gh'.encode('utf-8')) #加鹽iuqe832643873gh 5 obj.update(date.encode('utf-8')) # date 要加密的數據 6 result = obj.hexdigest() 7 return result 8 val = get_md5('123') 9 print(val) 10 USER_LIST = [] 11 12 def register(): 13 print('************用戶注冊************') 14 while True: 15 user = input('請輸入用戶名:') 16 if user == 'N': 17 return 18 pwd = input('請輸入密碼:') 19 temp = {'username': user, 'password': get_md5(pwd)} 20 USER_LIST.append(temp) 21 22 def login(): 23 print('************用戶登陸************') 24 user = input('請輸入用戶名:') 25 pwd = input('請輸入密碼') 26 for item in USER_LIST: 27 if item['username'] == user and item['password'] == get_md5(pwd): 28 return True 29 30 register() 31 result = login() 32 if result: 33 print('登陸成功!') 34 else: 35 print('登陸失敗!')