我正在尝试使用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,返回的值与转换站点给出的值相同。
答案 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等同于使用连接值调用它一次。