SHA-256哈希在Android中产生错误的结果

时间:2012-11-30 20:38:12

标签: android hash salt sha256

我正在尝试使用12345使用1111编码加密SHA-256,我得到的答案是:010def5ed854d162aa19309479f3ca44dc7563232ff072d1c87bd85943d0e930 这与this site返回的值不同。

以下是代码段:

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 个答案:

答案 0 :(得分: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等同于使用连接值调用它一次。