2011-07-27 38 views
10

我想用SHA2散列一些密碼。SHA中的SHA2密碼散列

我在哪裏可以得到一段Java代碼的代碼片段?

我看過那個帖子,但我有若有所失: SHA2 password storage with Java

Mac mac = Mac.getInstance("HmacSha256"); 
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256"); 
mac.init(secret); 
byte[] shaDigest = mac.doFinal(phrase.getBytes()); 
String hash = ""; 
for(byte b:shaDigest) { 
    hash += String.format("%02x",b); 
} 

這句話是我想要的字符串編碼嗎?什麼是關鍵(2號線)提前

感謝

+0

FYI:你可以閱讀一些關於密碼哈希的問題。雖然散列密碼是很好的做法,但要做到這一點並不重要。這個問題有一些很好的答案:[圖書館哈希密碼在Java中的建議](http://stackoverflow.com/questions/2860943/suggestions-for-library-to-hash-passwords-in-java) –

回答

0

短語是,你要保護的密碼。 key是鹽,散列之前附加到您的密碼的唯一(並且已知)字符串,擊敗彩虹表。或者至少應該是這樣。你的代碼只是從密碼本身取出,這是毫無意義的。它應該是一個與密碼摘要一起存儲的長隨機字符串。

8

您可以考慮使用公地編解碼器的實現

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt"); 
+0

這不是在Java SE中 – Supuhstar

22

首先,你需要明確什麼是你想做的事情。你說你想散列一個密碼,但是你使用的代碼是MAC(Message Authentication Code),特別是HMAC

爲了不同的目的,哈希和MAC是不同的東西(儘管HMAC確實涉及使用哈希)。你需要確保你正在使用正確的一個來滿足你的需求。

你被要求提供密鑰的原因是因爲MAC需要密鑰。散列不:

public byte[] hash(String password) throws NoSuchAlgorithmException { 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");   
    byte[] passBytes = password.getBytes(); 
    byte[] passHash = sha256.digest(passBytes); 
    return passHash; 
} 
10

我修改了一點Rossum的代碼,添加鹽和轉換返回類型爲String,增加try/catch語句,也許這將幫助別人:

public String hash(String password) { 
    try { 
     MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
     String salt = "some_random_salt"; 
     String passWithSalt = password + salt; 
     byte[] passBytes = passWithSalt.getBytes(); 
     byte[] passHash = sha256.digest(passBytes);    
     StringBuilder sb = new StringBuilder(); 
     for(int i=0; i< passHash.length ;i++) { 
      sb.append(Integer.toString((passHash[i] & 0xff) + 0x100, 16).substring(1));   
     } 
     String generatedPassword = sb.toString(); 
     return generatedPassword; 
    } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }  
    return null; 
}