[英]What is the equivalent of hashing Java code into C#?
我在從 C# 代碼轉換成 Java 獲取等效哈希碼時遇到一個奇怪的問題。 我不知道 MessageDigest 更新方法是做什么的。 它應該只更新摘要的內容,並在調用摘要后計算哈希。
我在 C# 中使用 SHAManaged512.ComputeHash(content) 做同樣的事情。 但我沒有得到相同的哈希碼。
以下是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()));
}
解決方案是放置第一個密鑰並將其與有效負載數據連接起來。
我有完全相同的問題。 自從您問起已經兩年了,但以防萬一有人遇到這個問題,這是解決方案
public static string encryptHash(string APIkey, string RequestBodyJson)
{
var secretBytes = Encoding.UTF8.GetBytes(APIkey);
var saltBytes = Encoding.UTF8.GetBytes(RequestBodyJson);
using (var sHA256 = new SHA256Managed())
{
byte[] bytes = sHA256.ComputeHash(saltBytes.Concat(secretBytes).ToArray());
//convert to hex
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
return builder.ToString();
}
}
Encoding.Unicode
(您在 C# ToJsonStream
方法中使用)不是 UTF8。 這是UTF16。 請參閱MSDN 。 (還要記住,UTF16 可以是小端或大端。)您正在尋找Encoding.UTF8
。
首先要做的是檢查您正在散列的字節數組是否相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.