【轉】python模塊分析之hashlib加密(二)html
hashlib模塊是用來對字符串進行hash加密的模塊,明文與密文是一一對應不變的關係;用於註冊、登陸時用戶名、密碼等加密使用。
一.函數分析:
1.共有5種加密算法:
md5(),sha1(),sha224(),sha256(),sha384(),sha512(),分別獲得不一樣的加密密文。
2.hashlib.hexdigest():獲取加密的密文,16進制,無參數。
3.hashlib.digest():獲取加密的密文,二進制,無參數。
4.hashlib.copy():複製一份當前建立的hash對象,無參數。
5.update(str1.encode("utf-8")):更新加密的密文,獲得的密文與原來的密文不相同。python
hash.name:查看當前得到的hash對象的加密算法;算法
hash.digest_size:hash密文佔多少個字節;函數
hash.block_size:hash數據塊的大小。大數據
hashlib.algorithms_guaranteed:查看全部平臺都支持的hash算法;網站
hashlib.algorithms_available:查看全部的hash加密算法。加密
二。運用:
1.建立哈希對象,有兩種方式:
m = hashlib.new("md5",b"cai") # 選擇md5加密函數加密字符串「cai」
m = hashlib.md5("cai".encode("utf-8")) # 加密的另外一種寫法spa
2.特殊用法:當須要加密的字符串過大的時候,可使用同一個hash對象分屢次加密,update(a)+update(b)=update(a+b).
舉例:code
1 m = hb.md5() 2 m1 = m.copy() 3 m.update("a".encode("utf-8")) 4 m.update("b".encode("utf-8")) 5 print(m.hexdigest()) # 輸出密文1
6 m1.update("ab".encode("utf-8")) 7 print(m1.hexdigest()) # 輸出與密文1徹底相同的密文2
3、hash算法的解密htm
加密算法獲得的密文不可逆,可是密文與明文之間的關係是一一對應的,這就使得解密出現了可能,目前對於簡單的、迭代次數少或不加鹽處理密文,經常使用
方法是用大數據儲存密文與明文的對應關係。
如經常使用的解密網站:http://www.cmd5.com/
經過輸入密文查找對應的明文。
爲了增大破解的難度,通常須要對密碼進行屢次迭代加密和加鹽處理,hashlib模塊有一個專門的函數。
1 import hashlib as hb 2 import binascii 3 # sha256爲算法名稱,123456789爲要加密的密碼, 4 # salt指的是雜質,額外的東西,使得更加難破解,10000是迭代次數,能夠理解成加密次數。 5 dk = hb.pbkdf2_hmac('sha256', b'123456789', b'salt', 10000) # 密碼和雜質都須要是二進制類型 6 print(binascii.hexlify(dk).decode("utf-8"))
代碼舉例:
1 import hashlib as hb 2
3
4 def hash_fun(str1): 5 m = hb.md5(str1.encode("utf-8")) # 建立一個hash對象,並對str1加密
6 print(m.hexdigest()) # 輸出獲得的密文
7 m.update(str1.encode("utf-8")) # 更新密文
8 print(m.hexdigest()) # 輸出更新密文,與前面再也不相同
9 print(m.digest()) # 獲取字節密文
10 print(m.block_size) # 獲取hash塊的大小
11 print(m.digest_size) # 獲取密文的字節數
12 print(m.name) # 獲取加密算法的名字md5
13
14
15 def hash_fun2(str1): 16 m = hb.md5(str1.encode("utf-8")) 17 print(m.hexdigest()) 18 a = m.copy() # 拷貝一個hash對象
19 print(a.hexdigest()) # 獲得的密文沒改變
20
21
22 def hash_fun1(str1): 23 m = hb.sha1(str1.encode("utf-8")) # sha1算法加密
24 print(m.hexdigest()) 25 m1 = hb.sha224(str1.encode("utf-8")) # sha224算法加密
26 print(m1.hexdigest()) 27
28
29 def hash_fun3(): 30 m = hb.md5() 31 m1 = m.copy() 32 m.update("a".encode("utf-8")) 33 m.update("b".encode("utf-8")) 34 print(m.hexdigest()) 35 m1.update("ab".encode("utf-8")) 36 print(m1.hexdigest()) 37
38
39 if __name__ == '__main__': 40 hash_fun("cai") 41 print() 42 hash_fun1("cai") 43 print() 44 hash_fun2("cai") 45 print() 46 hash_fun3()
結果以下: