2010年2月8日 星期一

Salt Please


一般開發人員在對使用者密碼作處理時,通常會使用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值以做比較

沒有留言: