我想寫一個密碼加密類,我可以用它來加密和存儲用戶密碼。我想確保我正確地做到了這一點。此代碼工作正常,似乎生成一個加密的密碼,但我想在這裏發佈,以獲得一些反饋。對我而言,這是相當複雜的,並且我知道加密中的任何事情,在沒有意識到你正在製造它們的情況下很容易犯錯。密碼加密
這裏是我的代碼:
public CipherHandler {
public String encryptPassword(char[] plaintext, String encoding) throws Exception {
MessageDigest msgDigest = null;
String hashValue = null;
/* Convert char array plaintext to byte array */
byte[] b = new byte[plaintext.length << 1];
for (int i = 0; i < plaintext.length; i++) {
b[i] = (byte) plaintext[i]; //will this work regardless of encoding?
}
try {
msgDigest = MessageDigest.getInstance("SHA-256");
msgDigest.update(b);
byte rawByte[] = msgDigest.digest();
hashValue = (new BASE64Encoder()).encode(rawByte);
} catch (NoSuchAlgorithmException e) {
System.out.println("No Such Algorithm Exists");
}
System.out.println(hashValue);
return hashValue;
}
}
此功能一般會從Swing事件處理程序在用戶輸入密碼進入JPassword場,這就是爲什麼我開始用炭稱爲[] 。爲了測試,我使用此代碼來調用該函數:
CipherHandler cp = new CipherHandler();
String initPW;
try {
initPW = cp.encryptPassword("welcome".toCharArray(), "UTF-8");
}
由於這是我第一次嘗試,我想,我忽略了一些東西。我對感興趣建議或意見。我有幾個具體的問題,雖然:
當我的char []轉換成一個byte [],我不相信,我正確地做這個。我如何知道使用哪種編碼?在這裏,我放置了「UTF-8」,主要是作爲佔位符,但我擔心在某些情況下這可能會失敗。
我已經讀過,我應該在密碼被消化後使用鹽和迭代,但我無法弄清楚如何做到這一點。有人可以請教我這個嗎?
我正在使用SHA-256。這是建議的算法嗎?我也讀過關於MD5的內容。是否有一種算法適用於密碼加密?
感謝您的任何幫助。我很感激!
參見[如何安全地散列密碼?](http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)。 SHA-256不適合密碼散列,並且需要鹽。 – CodesInChaos 2013-04-08 18:35:19