我将一些C#转换为Java。 C#是:
// Return a SHA256 hash of a string, formatted in hex
private static string HashPassword(string password)
{
SHA256Managed hash = new SHA256Managed();
byte[] utf8 = UTF8Encoding.UTF8.GetBytes(password);
return BytesToHex(hash.ComputeHash(utf8));
}
在Java中,我将SHA256Managed
替换为MessageDigest
:
private static String HashPassword(String password)
{
MessageDigest hash = MessageDigest.getInstance("SHA-256");
byte[] utf8 = hash.digest(password.getBytes(StandardCharsets.UTF_8));
return BytesToHex(hash.ComputeHash(utf8)); // ComputeHash?
}
但是MessageDigest
没有ComputeHash()
,也没有看到它的等价物。
MessageDigest
是否在这里使用正确的类?如果是这样,我该怎么办ComputeHash()
。如果不是我使用哪个班级?
请注意BytesToHex
将字节数组转换为十六进制字符串。
答案 0 :(得分:4)
MessageDigest
是有状态的。您会逐步将数据传递给它,并在您完成后调用digest()
来计算所有数据的哈希值。
您调用的hash.digest(byte[])
方法基本上是hash.update(byte[])
然后hash.digest()
的简写。
调用digest()
也会将MessageDigest
实例重置为其初始状态。
答案 1 :(得分:3)
在Java中,变量utf8
包含计算的哈希值,与C#不同。要匹配C#看起来的方式,它应该是:
byte[] utf8 = password.getBytes(StandardCharsets.UTF_8);
return bytesToHex(hash.digest(utf8));
附注:请遵守lowerCamelCased
方法名称的Java编码标准。