2012-11-30 41 views
3

我試圖用SHA-256編碼和我得到的答覆是使用1111鹽加密12345010def5ed854d162aa19309479f3ca44dc7563232ff072d1c87bd85943d0e930 這是不一樣的this site返回的值。SHA-256散列產生錯誤的結果在Android的

下面的代碼片段:

public String getHashValue(String entity, String salt){ 
    byte[] hashValue = null; 
    try { 
     MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
     digest.update(entity.getBytes("UTF-8")); 
     digest.update(salt.getBytes("UTF-8")); 
     hashValue = digest.digest(); 
    } catch (NoSuchAlgorithmException e) { 
     Log.i(TAG, "Exception "+e.getMessage()); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return BasicUtil.byteArrayToHexString(hashValue); 
} 

我已經驗證了我的一個樣本印刷方法從SO和結果是好的。有人能告訴我這裏有什麼問題嗎?

只是爲了澄清 - 當我在iOS代碼中加密相同的值& salt時,返回的值與轉換網站給出的值相同。

+1

我從鏈接的頁面獲得'010def5ed854d162aa19309479f3ca44dc7563232ff072d1c87bd85943d0e930'。你到底在幹什麼? – Grambot

+0

而我得到'b0c3d371142251569cb39f81280baeb73d5ed6f0b177386f8436d166d4a3cd6e'怎麼樣?! – kaderud

回答

2

如果在該站點中填充hmac secret的可選部分,將使用HmacSHA256算法。 同樣的結果可以用這個功能來製作:

public static String getHmac(String entity, String salt) throws Exception{ 
    Mac mac = Mac.getInstance("HmacSHA256"); 
    mac.init(new SecretKeySpec(salt.getBytes(), "HmacSHA1")); 
    byte[] bs = mac.doFinal(entity.getBytes()); 
    return new HexDumpEncoder().encode(bs); // use your favorite hex converter 
} 

如果你想從該網站輸出相同,試圖討論解決這個值「123451111」不HMAC祕密。

很明顯,調用MessageDigest.update兩次相當於使用連續值調用一次。

+0

非常感謝Akdeniz! – user642966