鹽 (密碼學)
鹽(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; //返回散列。
}
?>
參考文獻
- Essential PHP Security. : 98. ISBN 978-0596006563.