一般開發人員在對使用者密碼作處理時,通常會使用hash function去對user password做處理產生不可逆之hash值,而惡意人士現在則使用rainbow table這種大量事先產生好之明文<->hash之對應,使得hash變的相對的沒這麼安全了,所以就產生了進階的salt,其原理為我們將明文進行hash之前加入一random的salt值,而再將添加過salt值得明文產生hash值,如此一來就增加密碼被破解的難度,Java的salt範例如下:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import org.apache.commons.codec.binary.Base64;
/**
*
* @author andy
*/
public class MessageDigestExample {
public static void main(String args[]) {
MessageDigest md = null;
byte pwd[] = {'p','a','s','s','w','o','r','d'};
byte[] salt = new byte[8];//產生任意長度的salt值
try {
md = MessageDigest.getInstance("SHA-256");
md.update(pwd);
SecureRandom random = null;
random = SecureRandom.getInstance("SHA1PRNG");
random.nextBytes(salt); //產生salt
} catch (NoSuchAlgorithmException e) {
System.err.println(e);
}
md.update(salt); //加入salt
byte[] hash = md.digest();//產生加入salt的hash值
String encodedString = new String( Base64.encodeBase64(hash) );
System.out.println(encodedString);
}
}
而slat的對應表也儲存在文件或資料庫中,所以使用者輸入密碼後,流程將由原先的計算hash改為取得對應salt重新計算新的salt值以做比較
沒有留言:
張貼留言