2012-06-08 68 views
2

我想一個例子:Java的比較SHA-256散列字符串密碼明文字符串

String hashAlgorithm ="sha-256" 
... 
md=MessageDigest.getInstance(hashAlgorithm); 
byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes()); 
if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) { 
    ... 
} 

然而,散列密碼存儲在數據庫中的字符串。當我做這種比較時,它會失敗。當我調試它時,enteredPasswordDigest有32個字節長度,而realPassword.getBytes()有64個字節長度。

我錯過了什麼?

+0

你確定realPassword.getBytes()的長度是64位(= 8字節)而不是字節嗎?因爲我不知道可以創建64位輸出的安全散列函數。 – Robert

回答

0

我解決我的問題與觀點:哈希密碼作爲數據庫字符串是「十六進制」。這是主要的一點。所以我得到了輸入密碼的字節數組摘要的十六進制。然後我比較了具有十六進制值的字符串。

+0

既然您已經管理好了您所尋找的內容,那麼您可能需要考慮查看它以提高安全性。 – Jeach

0

假設realPassword是一個字符串,問題可能是Java字符串是UTF16,即每個字符2個字節。嘗試打印兩個字節數組,以更好地瞭解發生了什麼。

1

簡單,

  • 需要輸入的密碼和散列/消化它
  • 轉換byte[]
  • 該字符串比較已經散列密碼字符串中的DB

試試這個,

String hashedStr = new String(enteredPasswordDigest); 
if (!hashedStr.equals(realPassword)) { 
    ... 
} else { 
    ... 
} 

文檔:String.getBytes()

這種方法時此字符串不能在 默認字符集進行編碼的行爲是未指定的。當需要對編碼過程進行更多控制時,應使用java.nio.charset.CharsetEncoder 類。

+0

hashedStr的長度是32,但realPassword是64? – kamaci

+0

@kamaci:'realPassword.getBytes().length'是64,我沒有使用它。只需使用字符串'realPassword'本身,如我的帖子所示。而且長度確實是32. –