1. 程式人生 > >python模組分析之hashlib加密(二)

python模組分析之hashlib加密(二)

前言

hashlib模組是py3.+用來對字串進行hash加密的模組,核心演算法是md5,明文與密文是一一對應不變的關係;用於註冊、登入時使用者名稱、密碼等加密使用。

模組分析

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

hash演算法的解密

加密演算法得到的密文不可逆,但是密文與明文之間的關係是一一對應的,這就使得解密出現了可能,目前對於簡單的、迭代次數少或不加鹽處理密文,常用方法是用大資料儲存密文與明文的對應關係。如常用的解密網站:http://www.cmd5.com/

通過輸入密文查詢對應的明文。為了增大破解的難度,一般需要對密碼進行多次迭代加密和加鹽處理,hashlib模組有一個專門的函式pbkdf2_hmac。

  • 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編碼的字串

參考