python模塊hashlib(加密服務)知識點講解
官方文案:https://docs.python.org/zh-cn/3/library/hashlib.html
hashlib --- 安全哈希與消息摘要
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要digest algorithms算法呢?摘要算法又稱哈希hash算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
hash算法
每種類型的hash都有一個構建器方法,返回一個hash對象和相同的簡單接口。
例如:
使用sha256()創(chuàng)建一個SHA-256hash object??梢允褂胾pdate()喂給它bytes-like object。然后可以用digest()或hexdigest()來獲得數據的摘要。
hashlib模型有許多算法如:sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), and blake2s()。還有很多其他算法要看Python使用的OpenSSL libary。具體見文檔。
使用algorithms_guaranteed常量,查看模塊在所有平臺都支持的算法:
>>> hashlib.algorithms_guaranteed
{'blake2s', 'sha256', 'sha3_512', 'sha1', 'shake_128', 'sha3_256', 'sha3_384', 'blake2b', 'sha3_224', 'sha512', 'md5', 'shake_256', 'sha224', 'sha384'}
使用algorithms_available常量,在編譯器運行時可以的hash算法
>>> hashlib.algorithms_available
{'sha3_256', 'blake2b', 'md5', 'sha512_224', 'sha384', 'md4', 'sha256', 'sha512', 'whirlpool', 'sha224', 'sha512_256', 'shake_128', 'sha3_384', 'ripemd160', 'blake2s', 'sha3_512', 'sha1', 'sm3', 'shake_256', 'sha3_224', 'md5-sha1'}
例子:
>>> import hashlib >>> m = hashlib.sha256() >>> m.update(b" the spammish repetition") #重復調用相當于,把bytes字節(jié)串相加。 >>> m.name #hash算法的名字 'sha256' >>> m.digest() #返回傳入update()的數據的摘要 b'U<\x9bP\xb1\xa8\x9a\x9aE\x0f;h\xdb\x04\x11\xc1\x08\xfaH\xa7\t\xbfF\x91\x01\x13\xa1\x87\xb6\xd9`\x96' >>> m.digest_size #摘要的大小 >>> m.block_size #hash算法內的塊的大小 >>> m.hexdigest() #返回一個字符串對象,一般用在安全的email或其他非binary環(huán)境 '553c9b50b1a89a9a450f3b68db0411c108fa48a709bf46910113a187b6d96096' >>>
不同的算法安全不一樣,sha256就比sha1安全,但越安全的算法不僅越慢,摘要長度更長。
摘要算法應用
保存用戶輸入的密碼:正確的保存口令的方式是不存儲用戶的明文口令,而是存儲用戶口令的摘要,比如MD5.
摘要算法在很多地方都有廣泛的應用。要注意摘要算法不是加密算法,不能用于加密(因為無法通過摘要反推明文),只能用于防篡改,但是它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。
例子:
存儲MD5的好處是即使運維人員能訪問數據庫,也無法獲知用戶的明文口令。
設計一個驗證用戶登錄的函數,根據用戶輸入的口令是否正確,返回True或False:
# -*- coding: utf-8 -*-
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
import hashlib
def calc_md5(password):
m = hashlib.md5()
m.update(password.encode('utf-8'))
return m.hexdigest()
def login(user, password):
return db[user] == calc_md5(password)
# 測試:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')
希望腳本之家整理的相關知識點能夠幫助到大家,感謝你們的支持。
相關文章
詳解利用python-highcharts庫繪制交互式可視化圖表
本文主要和大家分享一個超強交互式可視化繪制工具-python-highcharts。python-highcharts就是使用Python進行Highcharts項目繪制,簡單的說就是實現Python和Javascript之間的簡單轉換層,感興趣的可以了解一下2022-03-03
python爬蟲開發(fā)之urllib模塊詳細使用方法與實例全解
這篇文章主要介紹了python爬蟲開發(fā)之urllib模塊詳細使用方法與實例全解,需要的朋友可以參考下2020-03-03
python?chinesecalendar報錯:"no?available?data?for?ye
這篇文章主要介紹了python?chinesecalendar報錯:“no?available?data?for?year?{},?only?year?between?[{},?{}]?supported“的相關知識,需要的朋友可以參考下2023-03-03

