hashlib模塊:
Version:Python 3.6.1
hashlib:不可逆加密
hmac:不可逆鍵值對方式加密
hashlib模塊:
hashlib模塊為不同的安全哈希/安全散列(Secure Hash Algorithm)和 資訊摘要演算法(Message Digest Algorithm)實作了一個公共的、通用的介面,也可以說是一個統一的入口,因為hashlib模塊不僅僅是整合了md5和sha模塊的功能,還提供了對更多中演算法的函式實作,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512,
使用步驟:
1、獲取一個哈希演算法對應的哈希物件:
(1):通過hashlib.new(哈希演算法名稱,初始出入資訊)來獲取這個哈希物件,如:hashlib.new(“MD5”,“username”),hashlib.new(“SHA1”,“username”)等,
(2):通過hashlib.哈希演算法名稱()來獲取這個哈希物件,如:hashlib.md5(),hashlib.sha1()等,
2、設定追加資訊:
呼叫哈希物件的updata(輸入的資訊)方法,設定追加資訊,多次呼叫后等價于把所有追加的引數全部拼接起來作為一個引數,傳遞給update(),是累加,不是覆寫,
3、獲取輸入資訊對應的摘要:
呼叫已經的到哈希物件的digest()或者hexdigest(),可得到傳遞給update()方法的字串引數的摘要資訊,
(1)digest()與hexdigest()的區別:
a、digest():摘要資訊是一個二進制格式的字串,其中可能包含非ASCII字符,包括NUL位元組,該字串長度可以通過哈希物件的digest_size屬性獲取,
b、hexdigest():摘要資訊是一個16進制格式的字串,該字串中只包含16進制的數字,且長度是digest()回傳結果長度的2倍,
示例代碼1:
def hash_test():
m = hashlib.md5()
m.update(b"username")
m.update(b"password") #最終加密的字串引數是:username + password
print(m.digest_size)
print(m.digest())
print(m.hexdigest())
hash_test()
回傳結果:
16
b'\xd5\x1c\x9a~\x93Stj` \xf9`-E))'
d51c9a7e9353746a6020f9602d452929
代碼示例2:
def hash_func():
# hashlib.new(name[, data]) 創建hashlib(非首選), name=演算法名, data:資料
hash = hashlib.new('sha1', 'username'.encode())
strs = hash.name # hash名稱, 可傳給new()使用
hash.update("password".encode()) # 位元組緩沖區 hash.update(x) hash.update(y) == hash.update(x+y)
hash = hash.copy() # 拷貝hash物件副本
print(strs, hash)
# algorithms_guaranteed回傳的是所有平臺支持的hash演算法的名稱,結果是一個集合
dics = hashlib.algorithms_guaranteed
print(dics)
# algorithms_available回傳的是在Python決議器中可用的hash演算法的名稱, 傳遞給new()時, 可識別,結果也是一個集合
dics1 = hashlib.algorithms_available
print(dics1)
"""
加鹽加密方法介紹:
hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
hash_name:hash名稱, password:資料, salt:鹽, iterations:回圈次數, dklen:密鑰長度
"""
hash_bytes = hashlib.pbkdf2_hmac('SHA1', b'password', b'80', 100, 64)
print(hash_bytes)
num = hash.digest_size # hash結果的大小
num1 = hash.block_size # hash演算法的內部塊的大小
print(num, num1)
hash_func()
回傳結果:
sha1
<sha1 HASH object @ 0x000002741602E030>
{'sha256', 'blake2s', 'sha224', 'sha3_512', 'shake_128', 'md5', 'sha384', 'blake2b', 'sha3_256', 'sha512', 'sha3_224', 'shake_256', 'sha1', 'sha3_384'}
{'sha256', 'blake2b', 'sha3_256', 'whirlpool', 'SHA', 'md5', 'sha384', 'RIPEMD160', 'dsaEncryption', 'sha', 'sha1', 'md4', 'SHA1', 'MD4', 'sha224', 'DSA-SHA', 'SHA256', 'sha512', 'sha3_224', 'SHA384', 'SHA224', 'SHA512', 'ripemd160', 'MD5', 'dsaWithSHA', 'blake2s', 'sha3_512', 'shake_128', 'DSA', 'shake_256', 'ecdsa-with-SHA1', 'sha3_384'}
b']\x85C\xff\x1d\xe8\xce\x97\x128\x9bP\xe6\x98\xdf/\x1eQ\x19\xb4\x04v\xf5\xcd\x00\xb8\xff#\xee\xa7\x07\x81)\xb8\xc7Se\x85\xef\xfa\x9d\x0e\x9auA8\x19\t\x0e\xee\xb5`\x9b\x07:2M\xd4\xc0\x0c\xfaz^/'
20
64
hmac模塊
hmac演算法也是一種一種單項加密演算法,并且它是基于上面各種哈希演算法/散列演算法的,只是它可以在運算程序中使用一個密鑰來增增強安全性,hmac模塊實作了HAMC演算法,提供了相應的函式和方法,且與hashlib提供的api基本一致,
使用步驟:
hmac模塊的使用步驟與hashlib模塊基本一致,只是在獲取hmac物件時,只能使用hmac.new()函式,因為hmac模塊沒有提供與具體哈希演算法對應的函式來獲取hmac物件,如:hashlib可以用hashlib.md5()來產生一個哈希物件,但是hmac不行,
代碼示例1:
def hmac_demo():
hash = hmac.new(b"pwd")
hash.update(b"uname")
h_str = hash.hexdigest()
print(h_str.upper())
boolean = hmac.compare_digest(h_str, hmac.new("pwd".encode(), "uname".encode()).hexdigest())
print(boolean)
hmac_demo()
回傳結果:
675440AD536E602C322C90F8E0051975
True
示例代碼2:
def hmac_func():
# 創建key和內容,再進行加密
# hmac.new(key, msg=None, digestmod=None)
# 創建新的hmac物件, key:鍵, msg:update(msg), digestmod:hash名稱(同hashlib.new())(默認md5)
hc = hmac.new("userid".encode())
hc.update("username".encode()) # 位元組緩沖區 hc.update(a) hc.update(b) == hc.update(a+b)
hash_bytes = hc.digest() # 位元組hash
print(hash_bytes)
hash_str = hc.hexdigest().upper() # 16進制hash字串
print(hash_str)
hc = hc.copy() # 拷貝hmac副本
print(hc)
num = hc.digest_size # hash大小
print(num)
strs = hc.name # hash名稱
print(strs)
# hmac.compare_digest(a, b) // 比較兩個hash密鑰是否相同, 引數可為: str / bytes-like object, (注:建議使用此方法,不建議使用a==b)
boolean = hmac.compare_digest(hmac.new("uid".encode(), "uname".encode()).digest(), hmac.new("uid".encode(), "uname".encode()).digest())
print(boolean)
hmac_func()
回傳結果:
b'\x82jU\xd4I\xa3A?\x1d\x05\x00\xd89\xf9z\xb1'
826A55D449A3413F1D0500D839F97AB1
<hmac.HMAC object at 0x0000014F15668080>
16
hmac-md5
True
不對之處還望批評指正,謝謝!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275410.html
標籤:其他
