Ich habe ein seltsames Problem, wenn ich äquivalenten Hash-Code aus C# -Code in Java übersetzt bekomme. Ich weiß nicht, was MessageDigest Update-Methode tun. Es sollte nur den Inhalt von Digest aktualisieren und nach dem Aufruf von Digest Hash berechnen.Was entspricht dem Hashing von Java-Code in C#?
Das gleiche mache ich in C# mit SHAManaged512.ComputeHash (Inhalt). Aber ich bekomme nicht den gleichen Hash-Code.
Folgendes ist der Java-Code.
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();
}
}
Es folgt C# -Code
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()));
}
Danke für Kommentare. Ich habe es alleine gemacht. Das Problem bestand darin, zuerst den C# -Seitenschlüssel und dann den Inhalt anzufügen. – Usman
@Usman In diesem Fall können Sie Ihre eigene Antwort akzeptieren. Was meine Antwort betrifft, so gilt es immer noch. Ich weiß nicht, wie es für Sie funktioniert, da UTF8 im Allgemeinen anders ist als UTF16 und Sie offensichtlich UTF8 in Java und UTF16 in C# verwenden. – ispiro
@ downvoter Vorsicht, warum? – ispiro