網(wǎng)站首頁 編程語言 正文
簡介
概念
散列算法(Hash Algorithm),又稱哈希算法,雜湊算法,是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個(gè)字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時(shí),其標(biāo)志值也會(huì)發(fā)生改變,從而告訴文件使用者當(dāng)前的文件已經(jīng)不是你所需求的文件
Hash簡單點(diǎn)講就是把任意一段數(shù)據(jù)經(jīng)過某種算法生成一段唯一的固定長度的數(shù)據(jù)
也可以把哈希值當(dāng)做是文件指紋,因?yàn)樗俏募ㄒ恍缘臉?biāo)志,與每一個(gè)字節(jié)都有關(guān),當(dāng)文件發(fā)生改變是,指紋值也會(huì)改變
- 如果把hash算法比喻為一座工廠
- 那傳給hash算法的內(nèi)容就是原材料
- 生成的hash值就是生產(chǎn)出的產(chǎn)品
特點(diǎn)
- 正向快速:給定明文和 Hash 算法,在有限時(shí)間和有限資源內(nèi)能計(jì)算得到 Hash 值
只要傳入的內(nèi)容一樣,得到的hash值必然一樣
- 逆向困難:給定 Hash 值,在有限時(shí)間內(nèi)很難逆推出明文
- 輸入敏感:原始輸入信息發(fā)生任何變化,新的 Hash 值都應(yīng)該出現(xiàn)很大變化
- 沖突避免:很難找到兩段內(nèi)容不同的明文,使得它們的 Hash 值一致
- 長度固定:只要我們使用是hash算法固定,無論傳入的內(nèi)容有多大,得到的hash值的長度是固定
- 信息摘要:hash只是信息的摘要,信息指紋,是用來做數(shù)據(jù)識別的
hash有哪些
常見 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已經(jīng)被破解,一般推薦至少使用 SHA2-256 算法
哈希算法 | 輸出長度(bit) | 輸出長度(字節(jié)) |
---|---|---|
MD5 | 128 bit | 16 bytes |
RipeMD160 | 160 bits | 20 bytes |
SHA-1 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
算法碰撞
稍微想一下就可以發(fā)現(xiàn),既然輸入數(shù)據(jù)長度不固定,而輸出的哈希值卻是固定長度的,這意味著哈希值是一個(gè)有限集合,而輸入數(shù)據(jù)則可以是無窮多個(gè),那么建立一對一關(guān)系明顯是不現(xiàn)實(shí)的。所以“碰撞”是必然會(huì)發(fā)生的,所以一個(gè)成熟的哈希算法會(huì)有較好的抗沖突性,同時(shí)在實(shí)現(xiàn)哈希表的結(jié)構(gòu)時(shí)也要考慮到哈希沖突的問題
- 比如“666”經(jīng)過 Hash 后是“fae0b27c451c728867a567e8c1bb4e53”,相同 Hash 算法得到的值是一樣的。比如 WiFi 密碼如果是 8 位純數(shù)字的話,頂多就是 99999999 種可能性,破解這個(gè)密碼需要做的就是提前生成好 0 到 1 億數(shù)字的 Hash 值,然后做 1 億次布爾運(yùn)算(就是 Bool 值判斷,0 或者 1),而現(xiàn)在普通 I5 四核 CPU 每秒能到達(dá) 200 億次浮點(diǎn)數(shù)計(jì)算,做 1 億次布爾運(yùn)算也就是秒級別的時(shí)間就破解了
- 8位大小寫字母、數(shù)字、特殊符號組成的密碼,若按照MD5加密,則hash值大概10000千億,i9算力每秒1千億。也需要至少24h。這只是極端情況下,如果加上加密算法不確定(比如3),請求時(shí)間(比如3),查詢時(shí)間(比如3),這就已經(jīng)需要半年左右,倘若再加上錯(cuò)誤等待時(shí)間(比如輸入5次錯(cuò)誤等待24小時(shí)),那就已經(jīng)需要50年。。。
當(dāng)然,如果有三萬臺(tái)電腦同時(shí)破解,也還是一天 -_-|||。
不過道高一尺,魔高一丈。誰又會(huì)傻乎乎的一個(gè)站著打一個(gè)等著挨。都是相對的
所以密碼盡量不要用純數(shù)字,因?yàn)楦緵]有任何安全性
加鹽防碰撞
對數(shù)字內(nèi)容進(jìn)行 Hash 運(yùn)算,獲取唯一的摘要值來指代原始完整的數(shù)字內(nèi)容,利用 Hash 函數(shù)的抗碰撞性來確保內(nèi)容未被篡改
常用于用戶名和密碼來確保用戶信息安全,為了防止攻擊會(huì)采用加鹽的方法,就是原來的明文加上一個(gè)隨機(jī)數(shù)之后的 Hash 值,Hash 值和鹽會(huì)保存在兩個(gè)地方,只要不是同時(shí)泄漏就很難被破解
加密
如果在Python中需要對用戶輸入的密碼或者其他內(nèi)容進(jìn)行加密,首選的方法是生成hash值
在Python中可以利用二個(gè)模塊來進(jìn)行:
- crypth
- ashlib
hashlib
主要方法
使用:hashlib.md5()
名稱 | 描述 |
---|---|
md5(…) | 利用md5算法加密 |
sha1(…) | 利用sha1算法加密 |
sha224(…) | 利用sha224算法加密 |
sha256(…) | 利用sha256算法加密 |
sha384(…) | 利用sha384算法加密 |
sha512(…) | 利用sha512算法加密 |
特有方法
如果你利用hashlib
生成了一個(gè)Hash對象,那么這個(gè)Hash對象會(huì)包含如下方法
名稱 | 描述 |
---|---|
update(arg) | 可以重復(fù)利用指定了特殊加密算法的Hash對象,對arg 進(jìn)行加密 |
digest(…) | 以字符形式返回加密內(nèi)容 |
hexdigest(…) | 以16進(jìn)制形式返回加密內(nèi)容 |
copy(…) | 為了達(dá)到重復(fù)利用Hash對象的目的,而克隆Hash對象 |
使用方法
直接使用hashlib方法
import hashlib hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")) # 加密 hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")).hexdigest() # 返回加密內(nèi)容
直接使用Hash對象中的方法
import hashlib # 造出工廠 m = hashlib.md5() # 放入原料 m.update("Nobody inspects".encode('utf-8')) # 產(chǎn)出hash值 m.digest() m.update("the spammish repetition".encode("utf-8")) m.digest() m.hexdigest()
加鹽
import hashlib # 造出工廠 m = hashlib.md5("this is salt".encode("utf-8")) # 放入原料 m.update("Nobody inspects".encode('utf-8')) # 產(chǎn)出hash值 m.digest() m.update("the spammish repetition".encode("utf-8")) m.digest() m.hexdigest()
crypt
主要方法
名稱 | 類型 | 描述 |
---|---|---|
crypt(…) | 方法 | 對指定內(nèi)容進(jìn)行hash加密 |
mksalt(…) | 方法 | 根據(jù)加密算法生成salt |
methods | list | 返回可用加密算法的列表 |
MOTHOD_CRYPT | 常量 | 加密算法 |
METHOD_MD5 | 常量 | md5加密算法 |
METHOD_SHA256 | 常量 | sha256加密算法 |
METHOD_SHA512 | 常量 | sha512加密算法 |
使用說明
使用crypt.crypt(…)進(jìn)行hash加密的時(shí)候,需要提供二個(gè)參數(shù):
- 加密內(nèi)容
- salt
import crypt salt = crypt.mksalt(crypt.METHOD_SHA512) hash = crypt.crypt("helloworld",salt)
應(yīng)用
密碼加密
m=hashlib.md5() m.update('key'.encode('utf-8')) #添加個(gè)其他元素,提升密碼復(fù)雜度,不是加鹽 m.update(password.encode('utf-8')) print(m.hexdigest())
應(yīng)用一致性校驗(yàn)
m = hashlib.md5() with open(r'E:\01.mp4','rb') as f: for line in f: m.update(line) print(m.hexdigest)
原文鏈接:https://www.cnblogs.com/liuzhongkun/p/15832813.html
相關(guān)推薦
- 2022-08-23 Python腳本提取fasta文件單序列信息實(shí)現(xiàn)_python
- 2023-06-16 GO的鎖和原子操作的示例詳解_Golang
- 2021-12-08 Linux之操作文件的系統(tǒng)調(diào)用_Linux
- 2022-09-21 android實(shí)現(xiàn)簡單底部導(dǎo)航欄_Android
- 2022-12-07 iOS開發(fā)刪除storyboard步驟詳解_IOS
- 2022-10-18 golang中使用匿名結(jié)構(gòu)體的方法_Golang
- 2022-08-03 Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽_Android
- 2022-10-17 C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支