訊息摘要 雜湊(hash) 加鹽

2022-03-01 08:46:57 字數 1727 閱讀 5155

hashlib

演算法介紹:

python的hashlib提供了常見的摘要演算法,如md5,sha1等等。

什麼是摘要演算法呢?摘要演算法又稱雜湊演算法、雜湊演算法。它通過乙個函式,把任意長度的資料轉換為乙個長度固定的資料串(通常用16進製制的字串表示)。

摘要演算法就是通過摘要函式f()對任意長度的資料data計算出固定長度的摘要digest,目的是為了發現原始資料是否被人篡改過。

摘要演算法之所以能指出資料是否被篡改過,就是因為摘要函式是乙個單向函式,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始資料做乙個bit的修改,都會導致計算出的摘要完全不同。

我們以常見的摘要演算法md5為例,計算出乙個字串的md5值:

import hashlib

md5 = hashlib.md5()

md5.update('how to use md5 in python hashlib?')

print(md5.hexdigest())

計算結果如下:

d26a53750bc40b38b65a520292f69306

如果資料量很大,可以分塊多次呼叫update(),最後計算的結果是一樣的:

md5 = hashlib.md5()

md5.update('how to use md5 in ')

md5.update('python hashlib?')

print(md5.hexdigest())

計算結果如下:

d26a53750bc40b38b65a520292f69306

md5是最常見的摘要演算法,速度很快,生成結果是固定的128 bit位元組,通常用乙個32位的16進製制字串表示。另一種常見的摘要演算法是sha1,呼叫sha1和呼叫md5完全類似:

import hashlib

sha1 = hashlib.sha1()

sha1.update('how to use sha1 in ')

sha1.update('python hashlib?')

print sha1.hexdigest()

sha1的結果是160 bit位元組,通常用乙個40位的16進製制字串表示。比sha1更安全的演算法是sha256和sha512,不過越安全的演算法越慢,而且摘要長度更長。

由於常用口令的md5值很容易被計算出來,所以,要確保儲存的使用者口令不是那些已經被計算出來的常用口令的md5,這一方法通過對原始口令加乙個複雜字串來實現,俗稱「加鹽」:

hashlib.md5("salt".encode("utf8"))

經過salt處理的md5口令,只要salt不被黑客知道,即使使用者輸入簡單口令,也很難通過md5反推明文口令。

但是如果有兩個使用者都使用了相同的簡單口令比如123456,在資料庫中,將儲存兩條相同的md5值,這說明這兩個使用者的口令是一樣的。有沒有辦法讓使用相同口令的使用者儲存不同的md5呢?

如果假定使用者無法修改登入名,就可以通過把登入名作為salt的一部分來計算md5,從而實現相同口令的使用者也儲存不同的md5。

摘要演算法在很多地方都有廣泛的應用。要注意摘要演算法不是加密演算法,不能用於加密(因為無法通過摘要反推明文),只能用於防篡改,但是它的單向計算特性決定了可以在不儲存明文口令的情況下驗證使用者口令。

參考:python基礎之常用模組

數字摘要和Hash函式(雜湊函式)

1 數字摘要 數字摘要是將任意長度的訊息變成固定長度的短訊息,它類似於乙個自變數是訊息的函式,也就是hash函式。數字摘要就是採用單項hash函式將需要加密的明文 摘要 成一串固定長度 128位 的密文這一串密文又稱為數字指紋,它有固定的長度,而且不同的明文摘要成密文,其結果總是不同的,而同樣的明文...

Hash 雜湊 雜湊

hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....

雜湊(hash 雜湊表)

可以認為雜湊有著陣列的思想,它將所有的資料段拼成乙個陣列 順序表 進行儲存,通過雜湊函式,可以基本上以o 1 的時間複雜度來查詢和儲存資料。通過資料段中的唯一關鍵字 key 經過某種演算法,得出此資料段在整個雜湊陣列 順序表 中的的下標,然後直接取元素即可。有資料結構如下 資料段 key,value...