将 Java 代码散列到 C# 中相当于什么?
What is the equivalent of hashing Java code into C#?
我在从翻译成 Java 的 C# 代码中获取等效哈希码时遇到了一个奇怪的问题。我不知道,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()));
}
Encoding.Unicode
(您在 C# ToJsonStream
方法中使用的)不是 UTF8。这是UTF16。参见 MSDN。 (另请记住,UTF16 可以是小端或大端。)您正在寻找 Encoding.UTF8
.
首先要做的是检查您正在散列的字节数组是否相同。
解决方案是首先放入密钥并将其与负载数据连接。
我遇到了完全相同的问题。自您问起已经两年了,但以防万一有人遇到这个问题,这里是解决方案
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();
}
}
我在从翻译成 Java 的 C# 代码中获取等效哈希码时遇到了一个奇怪的问题。我不知道,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()));
}
Encoding.Unicode
(您在 C# ToJsonStream
方法中使用的)不是 UTF8。这是UTF16。参见 MSDN。 (另请记住,UTF16 可以是小端或大端。)您正在寻找 Encoding.UTF8
.
首先要做的是检查您正在散列的字节数组是否相同。
解决方案是首先放入密钥并将其与负载数据连接。
我遇到了完全相同的问题。自您问起已经两年了,但以防万一有人遇到这个问题,这里是解决方案
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();
}
}