2012-11-30 40 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