我正在尝试在Java中使用ripemd160
对字符串进行哈希,以模拟以下PHP的输出:
$string = 'string';
$key = 'test';
hash_hmac('ripemd160', $string, $key);
// outputs: 37241f2513c60ae4d9b3b8d0d30517445f451fa5
尝试1
最初我尝试使用以下方法来模拟它...但我不认为可以使用ripemd160
作为 `getInstance`算法?
或许可以,只是我本地没有启用它?
public String signRequest(String uri, String secret) {
try {
byte[] keyBytes = secret.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac mac = Mac.getInstance("ripemd160");
mac.init(signingKey);
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(uri.getBytes());
// Convert raw bytes to Hex
byte[] hexBytes = new Hex().encode(rawHmac);
// Covert array of Hex bytes to a String
return new String(hexBytes, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
第二次尝试
这促使我寻找其他方式来实现以上目标,通过搜索SO和Google,我发现使用BouncyCastle可能是更好的选择。
后来我找到了这篇文章,它讨论了使用与我想要的相同算法和BouncyCastle进行哈希处理,只是没有使用密钥。(Cannot output correct hash in Java. What is wrong?)
public static String toRIPEMD160(String in) {
try {
byte[] addr = in.getBytes();
byte[] out = new byte[20];
RIPEMD160Digest digest = new RIPEMD160Digest();
byte[] rawSha256 = sha256(addr);
String encodedSha256 = getHexString(rawSha256);
byte[] strBytes = base64Sha256.getBytes("UTF-8");
digest.update(strBytes, 0, strBytes.length);
digest.doFinal(out, 0);
return getHexString(out);
} catch (UnsupportedEncodingException ex) {
return null;
}
}
我已经使它按预期运行。
问题
你会注意到在尝试2中目前没有办法提供给哈希一个密钥,我的问题是如何调整此函数以能够提供密钥并完成我需要模拟原始php函数的最后阶段:hash_hmac('ripemd160', $string, $key);
salt
直接添加到message
前面吗?这通常是加盐密码的方法。应该是一样的。 - qwelyt$key
是在A
和B
之间共享的,它只用于让您可以哈希到相同的校验和? - qwelyt