3

我正在尝试使用编码作为盐进行加密123451111SHA-256得到的答案是:010def5ed854d162aa19309479f3ca44dc7563232ff072d1c87bd85943d0e930 这与此站点返回的值不同。

这是代码片段:

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 代码中加密相同的值和盐时,返回的值与转换站点给出的值相同。

4

1 回答 1

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
}

如果您想从该站点获得相同的输出,请尝试在没有 hmac 密码的情况下散列此值“123451111”。

很明显,两次调用 MessageDigest.update 相当于使用连接值调用一次。

于 2012-12-01T23:00:08.967 回答