我如何在 java 中使用相同的 c# sha512
How can i use the same sha512 of c# in java
这是c#中使用的代码
public static string Encode_SHA512(string input) {
try {
using (SHA512 sha = SHA512.Create()) {
byte[] hash = sha.ComputeHash(Encoding.Unicode.GetBytes(input));
return Convert.ToBase64String(hash);
}
} catch (Exception ex) {
throw new Exception("Error al generar hash SHA512", ex);
}
}
这是java中使用的代码(多次尝试之一)
public static String Encode_SHA512(String input) {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] digest = md.digest(input.getBytes("UTF-16LE"));
return String.format("%0128x", new BigInteger(1, digest));
}
但总是结果不同。如何在java?
中使用相同的C#代码加密
问题出在您的 Java 版本中,您没有正确转换为 base64 编码的字符串。如果您将 Java 代码更新为以下内容,那么它们都会产生相同的哈希值:
public static String Encode_SHA512(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte [] inputBytes = input.getBytes("UTF-16LE");
byte[] digest = md.digest(inputBytes);
return Base64.getEncoder().encodeToString(digest);
}
行 return String.format("%0128x", new BigInteger(1, digest));
替换为 return Base64.getEncoder().encodeToString(digest);
,目前 base 64 对结果哈希进行编码。也许代码令人困惑的原因是 digest
方法生成的 byte[]
看起来与 Java 中的不同,字节类型是二进制补码(已签名),因此 -128 到 + 127 而在 C# 中,它是无符号的,因此在 0 到 255 之间,因此在调试器中,任何以 1 开头的字节看起来都不一样,因为它在 Java 中显示为负数,但在 C# 中显示为正数。
这是c#中使用的代码
public static string Encode_SHA512(string input) {
try {
using (SHA512 sha = SHA512.Create()) {
byte[] hash = sha.ComputeHash(Encoding.Unicode.GetBytes(input));
return Convert.ToBase64String(hash);
}
} catch (Exception ex) {
throw new Exception("Error al generar hash SHA512", ex);
}
}
这是java中使用的代码(多次尝试之一)
public static String Encode_SHA512(String input) {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] digest = md.digest(input.getBytes("UTF-16LE"));
return String.format("%0128x", new BigInteger(1, digest));
}
但总是结果不同。如何在java?
中使用相同的C#代码加密问题出在您的 Java 版本中,您没有正确转换为 base64 编码的字符串。如果您将 Java 代码更新为以下内容,那么它们都会产生相同的哈希值:
public static String Encode_SHA512(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte [] inputBytes = input.getBytes("UTF-16LE");
byte[] digest = md.digest(inputBytes);
return Base64.getEncoder().encodeToString(digest);
}
行 return String.format("%0128x", new BigInteger(1, digest));
替换为 return Base64.getEncoder().encodeToString(digest);
,目前 base 64 对结果哈希进行编码。也许代码令人困惑的原因是 digest
方法生成的 byte[]
看起来与 Java 中的不同,字节类型是二进制补码(已签名),因此 -128 到 + 127 而在 C# 中,它是无符号的,因此在 0 到 255 之间,因此在调试器中,任何以 1 开头的字节看起来都不一样,因为它在 Java 中显示为负数,但在 C# 中显示为正数。