hashlib模塊是py3.+用來對字符串進行hash加密的模塊,核心算法是md5,明文與密文是一一對應不變的關係;用於註冊、登陸時用戶名、密碼等加密使用。python
hashlib模塊有多種加密算法如:'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s','sha3_224', 'sha3_256', 'sha3_384', 'sha3_512','shake_128', 'shake_256'等;算法
全部的算法是基於二進制加密的,因此對須要加密的字符串須要先進行編碼。函數
hashlib.algorithms_guaranteed:查看全部平臺都支持的hash算法; hashlib.algorithms_available:查看全部的hash加密算法。
hashlib.hexdigest():獲取加密的密文,十六進制字符串,無參數。 hashlib.digest():獲取加密的密文,二進制,無參數。 hashlib.copy():複製一份當前建立的hash對象,無參數。 update(str1.encode("utf-8")):添加新的加密密文,獲得的密文與原來的密文不相同。 # 建立一個加密對象 m = hashlib.new("md5",b"cai") # 選擇md5加密函數加密字符串「cai」 m.name:查看當前得到的hash對象的加密算法; m.digest_size:hash密文佔多少個字節; m.block_size:hash數據塊的大小。
import hashlib m = hashlib.new("md5", b"cai") # 使用new的方式建立 m = hashlib.md5("cai".encode()) # 直接指定加密算法 m = hashlib.sha1("cai".encode()) m = hashlib.sha224("cai".encode()) m = hashlib.sha3_256("cai".encode()) m = hashlib.sha3_384("cai".encode())
當須要加密的字符串過大的時候,能夠使用同一個hash對象分屢次加密,update(a)+update(b)=update(a+b).大數據
import hashlib as hb m = hb.md5() m1 = m.copy() string = "adbcefg" for s in string: m.update(s.encode("utf-8")) # 輸出密文1 print(m.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1 # 輸出與密文1徹底相同的密文2 m1.update(string.encode("utf-8")) print(m1.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1
加密算法獲得的密文不可逆,可是密文與明文之間的關係是一一對應的,這就使得解密出現了可能,目前對於簡單的、迭代次數少或不加鹽處理密文,經常使用方法是用大數據儲存密文與明文的對應關係。如經常使用的解密網站:http://www.cmd5.com/網站
經過輸入密文查找對應的明文。爲了增大破解的難度,通常須要對密碼進行屢次迭代加密和加鹽處理,hashlib模塊有一個專門的函數pbkdf2_hmac。編碼
# 參數 hash_name:簽名算法名; password:須要加密的二進制編碼 salt:加鹽 iterations:迭代次數 import hashlib as hb import binascii import base64 pwd = "fdskhfkshfks" salt = "hhhhhhhh" # 獲取加密後的二進制數 dk = hb.pbkdf2_hmac('sha256', pwd.encode("utf-8"), salt.encode("utf-8"), 10000) # 密碼和雜質都須要是二進制類型 print(dk) # b'\x13O\xd5jj\x92\xfd\xf9\xef\xaa>W[c\x06\xe0\x96D=&\x02R\xd683\xee8\x11\xfbX\xb6\xf6' # 轉換成十六進制對應的字符串 print(binascii.hexlify(dk).decode("utf-8")) # 134fd56a6a92fdf9efaa3e575b6306e096443d260252d63833ee3811fb58b6f6 # 轉換成base64爲編碼的字符串 print(base64.b64encode(dk).decode()) # E0/VamqS/fnvqj5XW2MG4JZEPSYCUtY4M+44EftYtvY=
import hashlib as hb import base64 def hash_fun(str1): m = hb.md5(str1.encode("utf-8")) # 建立一個hash對象,並對str1加密 # 輸出獲得的密文 print(m.hexdigest()) # base64編碼的密文 print(base64.b64encode(m.digest()).decode()) print(m.block_size) # 獲取hash塊的大小 print(m.digest_size) # 獲取密文的字節數 print(m.name) # 獲取加密算法的名字md5 def hash_fun2(str1): m = hb.md5(str1.encode("utf-8")) print(m.hexdigest()) a = m.copy() # 拷貝一個hash對象 print(a.hexdigest()) # 獲得的密文沒改變 hash_fun("sb")
咱們通常經過new或pbkdf2_hmac函數加密字符串;加密
加密的密文涉及到顯示使用十六進制對應的字符串或base64編碼的字符串3d