雜湊加鹽作為金鑰的意義

2021-08-18 13:24:17 字數 2424 閱讀 2610

主要為了防止黑客利用使用者常用密碼庫進行碰撞,加鹽後黑客就無法通過此方法碰撞。

參考自

如果你需要儲存密碼(比如**使用者的密碼),你要考慮如何保護這些密碼資料,象下面那樣直接將密碼寫入資料庫中是極不安全的,因為任何可以開啟資料庫的人,都將可以直接看到這些密碼

原始密碼經雜湊函式計算後得到乙個雜湊值

改變原始密碼,雜湊函式計算出的雜湊值也會相應改變

同樣的密碼,雜湊值也是相同的

雜湊函式是單向、不可逆的。也就是說從雜湊值,你無法推算出原始的密碼是多少

有了雜湊函式,我們就可以將密碼的雜湊值儲存進資料庫。使用者登入**的時候,我們可以檢驗使用者輸入密碼的雜湊值是否與資料庫中的雜湊值相同。

由於雜湊函式是不可逆的,即使有人開啟了資料庫,也無法看到使用者的密碼是多少。

那麼儲存經過雜湊函式加密後的密碼是否就是安全的了呢?我們先來看一下幾種常見的破解密碼的方法。

最簡單、常見的破解方式當屬字典破解(dictionary attack)和暴力破解(brute force attack)方式。這兩種方法說白了就是猜密碼。

字典破解和暴力破解都是效率比較低的破解方式。如果你知道了資料庫中密碼的雜湊值,你就可以採用一種更高效的破解方式,查表法(lookup tables)。還有一些方法,比如逆向查表法(reverse lookup tables)、彩虹表(rainbow tables)等,都和查表法大同小異。現在我們來看一下查表法的原理。

查表法不像字典破解和暴力破解那樣猜密碼,它首先將一些比較常用的密碼的雜湊值算好,然後建立一張表,當然密碼越多,這張表就越大。當你知道某個密碼的雜湊值時,你只需要在你建立好的表中查詢該雜湊值,如果找到了,你就知道對應的密碼了。

從上面的查表法可以看出,即便是將原始密碼加密後的雜湊值儲存在資料庫中依然是不夠安全的。那麼有什麼好的辦法來解決這個問題呢?答案是加鹽。

鹽(salt)是什麼?就是乙個隨機生成的字串。我們將鹽與原始密碼連線(concat)在一起(放在前面或後面都可以,對於密碼可以這樣弄,其他情況就不行,可以看看文章下面),然後將concat後的字串加密。採用這種方式加密密碼,查表法就不靈了(因為鹽是隨機生成的)。

為了防止黑客通過彩虹表根據雜湊值反推原始口令,在計算雜湊的時候,不能僅針對原始輸入計算,需要增加乙個salt來使得相同的輸入也能得到不同的雜湊,這樣,大大增加了黑客破解的難度。

如果salt是我們自己隨機生成的,通常我們計算md5時採用md5(message + salt)。但實際上,把salt看做乙個「口令」,加salt的雜湊就是:計算一段message的雜湊時,根據不通口令計算出不同的雜湊。要驗證雜湊值,必須同時提供正確的口令。但是隨便加鹽會有很多問題,就是如果採用md5(salt+message),這種方式會遇到雜湊長度擴充套件攻擊

這實際上就是hmac演算法:keyed-hashing for message authentication。它通過乙個標準演算法,在計算雜湊的過程中,把key混入計算過程中。

和我們自定義的加salt演算法不同,hmac演算法針對所有雜湊演算法都通用,無論是md5還是sha-1。採用hmac替代我們自己的salt演算法,可以使程式演算法更標準化,也更安全。

python自帶的hmac模組實現了標準的hmac演算法。我們來看看如何使用hmac實現帶key的雜湊。

>>> 

import hmac

>>> message = b'hello, world!'

>>> key = b'secret'

>>> h = hmac.new(key, message, digestmod='md5')

>>>

# 如果訊息很長,可以多次呼叫h.update(msg)

>>> h.hexdigest()

'fa4ee7d173f2d97ee79022d1a7355bcf'

md5(md5(password)+salt)

sha512(sha512(password)+salt)

引入慢雜湊: bcrypt(sha512(password), salt, cost)

XMPP作為乙個工具的意義

伺服器 為xmpp節提供路由,是否支援server server通訊也是很重要的特性,常見的服務有openfire,tigase,m link等 客戶端 一般為人類驅動的實體,也可以是自動化的機械人實體 聊天機械人 元件 xmpp擴充套件 xep 0114 使用該擴充套件協議可以實現服務實現無關的擴...

c 以const 作為返回值的意義何在

const rational operator const rational lhs,const rational rhs 很多程式設計師第一眼看到它會納悶 為什麼operator 的返回結果是乙個const物件?因為如果不是這樣,使用者就可以做下面這樣的壞事 rational a,b,c a b ...

C 以const 作為返回值型別的意義

const rational operator const rational lhs,const rational rhs 很多程式設計師第一眼看到它會納悶 為什麼operator 的返回結果是乙個const物件?因為如果不是這樣,使用者就可以做下面這樣的壞事 rational a,b,c a b ...