Python中hash加密簡介及使用方法
簡介
概念
散列算法(Hash Algorithm),又稱哈希算法,雜湊算法,是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個(gè)字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時(shí),其標(biāo)志值也會發(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ā)生改變是,指紋值也會改變
- 如果把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í)的。所以“碰撞”是必然會發(fā)生的,所以一個(gè)成熟的哈希算法會有較好的抗沖突性,同時(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)然,如果有三萬臺電腦同時(shí)破解,也還是一天 -_-|||。
不過道高一尺,魔高一丈。誰又會傻乎乎的一個(gè)站著打一個(gè)等著挨。都是相對的
所以密碼盡量不要用純數(shù)字,因?yàn)楦緵]有任何安全性
加鹽防碰撞
對數(shù)字內(nèi)容進(jìn)行 Hash 運(yùn)算,獲取唯一的摘要值來指代原始完整的數(shù)字內(nèi)容,利用 Hash 函數(shù)的抗碰撞性來確保內(nèi)容未被篡改
常用于用戶名和密碼來確保用戶信息安全,為了防止攻擊會采用加鹽的方法,就是原來的明文加上一個(gè)隨機(jī)數(shù)之后的 Hash 值,Hash 值和鹽會保存在兩個(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對象會包含如下方法
名稱 | 描述 |
---|---|
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)
到此這篇關(guān)于Python中hash加密的文章就介紹到這了,更多相關(guān)Python hash加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python編程冒泡排序法實(shí)現(xiàn)動圖排序示例解析
這篇文章主要介紹了python編程中如何使用冒泡排序法實(shí)現(xiàn)動圖排序的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10python使用numpy按一定格式讀取bin文件的實(shí)現(xiàn)
這篇文章主要介紹了python使用numpy按一定格式讀取bin文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Python如何利用Har文件進(jìn)行遍歷指定字典替換提交的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Python如何利用Har文件進(jìn)行遍歷指定字典替換提交的數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python3 常用數(shù)據(jù)標(biāo)準(zhǔn)化方法詳解
這篇文章主要介紹了Python3 常用數(shù)據(jù)標(biāo)準(zhǔn)化方法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03