鹽 (密碼學)

(Salt),在密碼學中,是指在雜湊之前將雜湊內容(例如:密碼)的任意固定位置插入特定的字串。這個在雜湊中加入字串的方式稱為「加鹽」。其作用是讓加鹽後的雜湊結果和沒有加鹽的結果不相同,在不同的應用情景中,這個處理可以增加額外的安全性。

在大部份情況,鹽是不需要保密的。鹽可以是隨機產生的字串,其插入的位置可以也是隨意而定。如果這個雜湊結果在將來需要進行驗證(例如:驗證使用者輸入的密碼),則需要將已使用的鹽記錄下來。

安全因素

通常情況下,當欄位經過雜湊處理(如SHA-1),會生成一段雜湊值,而雜湊後的值一般是無法通過特定演算法得到原始欄位的。但是某些情況,比如一個大型的彩虹表,通過在表中搜尋該SHA-1值,很有可能在極短的時間內找到該雜湊值對應的真實欄位內容。

加鹽後的雜湊值,可以極大的降低由於使用者資料被盜而帶來的密碼洩漏風險,即使通過彩虹表尋找到了雜湊後的數值所對應的原始內容,但是由於經過了加鹽,插入的字串擾亂了真正的密碼,使得獲得真實密碼的概率大大降低。

實現原理

加鹽的實現過程通常是在需要雜湊的欄位的特定位置增加特定的字元,打亂原始的字串,使其生成的雜湊結果產生變化。比如,使用者使用了一個密碼:

x7faqgjw

經過SHA雜湊後,可以得出結果:

58ecbf2b3136ceda7fddfd986ba8bd8d59b2d73779691e839f3f176ce2c04b84

但是由於使用者密碼位數不足,短密碼的雜湊結果很容易被彩虹表破解,因此,在使用者的密碼末尾添加特定字串(綠色字型為加鹽的欄位):

x7faqgjwabcdefghijklmnopqrstuvwxyz

因此,加鹽後的密碼位數更長了,雜湊的結果也發生了變化:

7b5001a5a8bcdcfa1b64d41f6339cfa7a5c0eca04cca6ff6a6c1d6aad17794cc

以上就是加鹽過程的簡單描述,在實際使用過程中,還需要通過特定位數插入、倒序或多種方法對原始密碼進行固定的加鹽處理,使得雜湊的結果更加不容易被破解或輕易得到原始密碼,比如(綠色字型為加鹽字串):

x7afabqgcjw

代碼樣本

PHP

//这是一个简单的、在输入内容之後加入“WIKIPEDIA”并进行散列的PHP代码。
<?php
function hash($a) {
    $salt="WIKIPEDIA"; //定义一个加盐字段(WIKIPEDIA),一旦设定并使用,将不可更动。
    $b=$a.$salt; //把密码和加盐字段连接。
    $b=sha($b); //执行MD5散列。
    return $b; //返回散列。
}
?>

參考文獻