網站首頁 編程語言 正文
1.hashlib的簡介
hashlib 是一個提供了一些流行的hash(摘要)算法的Python標準庫.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等
什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。更多請看:hashlib — 安全哈希與消息摘要
2.hashlib的使用
本文以hashlib中MD5算法為例,其他的sha224、sha256算法用法和MD5基本一致。
1. 常用屬性
hashlib.algorithms
#列出所有加密算法
h.digest_size
#產生的散列字節大小。
h.block_size
#哈希內部塊的大小
2. 常用方法
hash.new([arg])
# 創建指定加密模式的hash對象
hash.update(arg)
# 更新哈希對象以字符串參數。如果同一個hash對象重復調用該方法,m.update(a); m.update(b) 等價于 m.update(a+b)
hash.digest()
# 返回摘要,作為二進制數據字符串值。
hash.hexdigest()
# 返回摘要,作為十六進制數據字符串值
hash.copy()
# 復制
3. 使用示例
# MD5 的使用
#其它的sha1,sha256就是加密函數不一樣,其余基本相同,這里就不演示了
import hashlib
def jm_md5(password):
m = hashlib.md5() # 構建MD5對象
m.update(password.encode(encoding='utf-8')) #設置編碼格式 并將字符串添加到MD5對象中
password_md5 = m.hexdigest() # hexdigest()將加密字符串 生成十六進制數據字符串值
return password, password_md5
g = jm_md5('123456')
print(g)
#結果輸出:
('123456', 'e10adc3949ba59abbe56e057f20f883e')
3.hashlib的特點
- 摘要算法在很多地方都有廣泛的應用。
- 要注意摘要算法不是加密算法,不能用于加密(因為無法通過摘要反推明文),只能用于防篡改。
- 它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。
一個優秀的 hash 算法,將能實現:
- 正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。
- 逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
- 輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不同。
- 沖突避免:很難找到兩段內容不同的明文,使得它們的 hash 值一致(發生沖突)。即對于任意兩個不同的數據塊,其hash值相同的可能性極小;對于一個給定的數據塊,找到和它hash值相同的數據塊極為困難。
4.實際演示
1. 基本演示
import hashlib
# 一、在構建對象直接插入加密字符串
m1 = hashlib.md5('hello python'.encode(encoding='utf-8')) # 構建MD5對象
print(m1.hexdigest()) # 結果為: e53024684c9be1dd3f6114ecc8bbdddc
# 二、通過update方法 往MD5對象中增加字符串參數
m2 = hashlib.md5() # 構建MD5對象
m2.update('hello python'.encode(encoding='utf-8')) # 設置編碼格式 并將字符串添加到MD5對象中
password_md5 = m2.hexdigest()
print(m2.hexdigest()) # 結果為 e53024684c9be1dd3f6114ecc8bbdddc
# 三、當數據量過過大時,可以分塊摘要,例如:
m3 = hashlib.md5()
m3.update("hello ".encode("utf-8")) # 注意:分塊是空格也要保持一致
m3.update("python".encode("utf-8"))
print(m3.hexdigest()) # 結果為:e53024684c9be1dd3f6114ecc8bbdddc
# MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。
三種方式,往構造的MD5對象中傳參,只要傳參的字符串一致,最后生成的結果是一樣的。
這說明hash算法就像一座工廠,工廠接收你送來的原材料(可以用m.update()為工廠運送原材料),經過加工返回的產品就是hash值。這也是摘要算法的一個特點,它不是加密算法,不能用于加密(因為無法通過摘要反推明文),只能用于防篡改。
2. 應用場景案例
hashlib模塊主要應用于,用戶賬號密碼登錄,對明文密碼進行加密等
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
import hashlib
USER_LIST = []
def pwd_Md5(password):
password = password+'hello python' # 字符串混淆加鹽,可以設置更復雜一點
return hashlib.md5(password.encode("utf-8")).hexdigest()
def register():
print('**************用戶注冊**************')
while True:
user = input('請輸入用戶名:')
if user.isalpha():
break
while True:
password1 = input('請輸入密碼>>>:').strip()
passwprd2 = input('請重復密碼>>>:').strip()
if password1 == passwprd2:
password = pwd_Md5(password1) # 將密碼進行Md5加密
break
else:
print('密碼不正確,重新輸入!')
temp = {'username':user,'password':password}
USER_LIST.append(temp)
def login():
print('**************用戶登陸**************')
user = input('請輸入用戶名:')
pwd = input('請輸入密碼:')
for item in USER_LIST:
if item['username'] == user and item['password'] == pwd_Md5(pwd):
return True
if __name__=='__main__':
register()
if login():
print('登陸成功')
else:
print('登陸失敗')
#結果輸出:
**************用戶注冊**************
請輸入用戶名:lizexiong
請輸入密碼>>>:123456
請重復密碼>>>:123456
**************用戶登陸**************
請輸入用戶名:lizexiong
請輸入密碼:123456
登陸成功
用戶登錄需要使用密碼,密碼一定要加密,保證用戶的信息安全。
- 加密可以使用hashlib模塊進行加密。
- 加密可以寫成加密函數,方便多處調用
- 提高密碼解密的復雜性,代碼中多加字符串。(加密算法雖然依然非常厲害,但是也存在缺陷,即:通過撞庫可以反解。所以,有必要對加密密碼進行加鹽。)
原文鏈接:https://blog.csdn.net/qdPython/article/details/127690372
相關推薦
- 2022-11-06 關于useEffect執行兩次的問題及解決_React
- 2022-08-16 C#工程建立后修改工程文件名與命名空間操作_C#教程
- 2023-09-17 Git “強制“提交代碼
- 2022-09-18 iOS開發retina屏幕下的點與像素關系詳解_IOS
- 2022-11-19 GoLang中的iface?和?eface?的區別解析_Golang
- 2022-05-11 python?DataFrame數據分組統計groupby()函數的使用_python
- 2022-03-18 C#?利用Autofac批量接口注入依賴的問題小結_C#教程
- 2022-11-01 zxing二維碼位矩陣轉換成Bitmap位圖的實戰教程_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支