我有一个奇怪的问题,从C#代码翻译成Java获取等价的哈希码。我不知道,MessageDigest更新方法是做什么的。它应该只更新摘要的内容,并应在调用摘要后计算散列值。将Java代码散列到C#中的等效功能是什么?
我正在用C#与SHAManaged512.ComputeHash(内容)做同样的事情。但我没有得到相同的哈希码。
以下是Java代码。
public static String hash(String body, String secret) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(body.getBytes("UTF-8"));
byte[] bytes = md.digest(secret.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException();
}
}
以下是C#代码
private byte[] ComputeContentHash(string contentBody)
{
using (var shaM = new SHA512Managed())
{
var content = string.Concat(contentBody, Options.SecretKey);
var hashedValue = shaM.ComputeHash(ToJsonStream(content));
return hashedValue;
}
}
public static Stream ToJsonStream(object obj)
{
return new MemoryStream(Encoding.Unicode.GetBytes(obj.ToString()));
}
感谢您的意见。 我是自己做的。问题是先追加C#端的Secret Key,然后追加Content。 – Usman
@Usman在这种情况下,你可以接受你自己的答案。至于我的回答,它依然成立。我不知道它是如何工作的,因为UTF8通常与UTF16不同,并且您明显在C#中使用UTF8和Java和UTF16。 – ispiro
@downvoter谨慎解释为什么? – ispiro