2010-11-15 81 views
3

對於應用程序原型,我創建了一個簡單的用戶登錄。然後使用sha224散列用戶的密碼並將其傳輸到後端。我現在面臨的問題是以下。存儲在數據庫中的密碼(使用sha224進行散列處理)看起來與我發送的散列表有點不同。我使用下面的代碼來創建哈希。android sha224和python之間的區別sha224

定密碼==測試

的Python

from hashlib import sha224 
sha224("test").hexdigest() 

安卓

MessageDigest sha224 = MessageDigest.getInstance("SHA-224"); 
sha224.update(key.getBytes()); 

byte[] digest = sha224.digest(); 
StringBuffer buffer = new StringBuffer(); 

for(int i = 0; i < digest.length; i++) { 
buffer.append(String.valueOf(Integer.toHexString(0xFF & digest[i]))); 
} 

return buffer.toString(); 

現在什麼會產生這個樣子的,我會發布兩個散列的正下方彼此。 (第一個是Python和第二機器人)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

他們幾乎是相同的,但蟒蛇哈希有兩個0以上。你們有什麼想法,爲什麼?

回答

4

您沒有正確格式化Android上的十六進制值;領先的0被丟棄。

buffer.append(String.format("%02x", 0xFF & digest[i])); 
+0

有趣的是,並非所有零都被丟棄,即第一個數字是90.那裏發生了什麼? – whatnick 2010-11-15 13:33:29

+0

好吧0號在奇數位置被丟棄我會寫一個更好的解釋。 – whatnick 2010-11-15 13:35:04

+0

@whatnick:刪除其他零將改變該值。只有前導零不會改變實際值。 – 2010-11-15 13:35:55

0
final MessageDigest mDigest = MessageDigest.getInstance("SHA-224"); 
byte[] messageDigest = mDigest.digest(toEncrypt.getBytes()); 
final BigInteger number = new BigInteger(1, messageDigest); 
final String sha = number.toString(16); 
final int diff = 32 - sha.length(); 
final StringBuilder finalSHA = new StringBuilder(32); 
for (int i=0;i<diff;i++) { 
finalSHA.append("0"); 
} 
finalSHA.append(sha); 
return finalSHA.toString(); 
0

你在一個時間十六進制轉換爲字符串在對2。第一個爲dropped的零在23位,即奇數位置。這是領先的零。您需要在必要時將轉換後的十六進制數字填零。沒有BigInteger的替代實現:

MessageDigest sha224 = MessageDigest.getInstance("SHA-224"); 
sha224.update(key.getBytes()); 

byte[] digest = sha224.digest(); 
StringBuffer buffer = new StringBuffer(); 

for(int i = 0; i < digest.length; i++) { 
    String hex_string = Integer.toHexString(0xFF & digest[i]); 
    if(hex_string.length()==1) hex_string = "0"+hex_string; 
    buffer.append(hex_string); 
} 

return buffer.toString(); 
相關問題