Java SHA-512 函数只产生 508 位输出?
Java SHA-512 function only producing a 508 bit output?
我有一个循环遍历并散列的数据点。我正在使用 SHA-512 的 Java 实现来散列我的数据。哈希应该产生一个 128 个字符的字符串,但有时它会产生一个 127 个字符的字符串,这会导致我的代码出现越界异常。
该代码通常会在计算的每 20 个不同哈希值中产生不正确的长度哈希值 1。
这是我用来实现散列的代码,来自
https://www.geeksforgeeks.org/sha-512-hash-in-java/
public static String SHA512(String input)
{
try {
// getInstance() method is called with algorithm SHA-512
MessageDigest md = MessageDigest.getInstance("SHA-512");
// digest() method is called
// to calculate message digest of the input string
// returned as array of byte
byte[] messageDigest = md.digest(input.getBytes());
// Convert byte array into signum representation
BigInteger no = new BigInteger(1, messageDigest);
// Convert message digest into hex value
String hashtext = no.toString(16);
// Add preceding 0s to make it 32 bit
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
// return the HashText
return hashtext;
}
// For specifying wrong message digest algorithms
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
这是上面列出的代码生成的正确长度(128 个字符)的散列:
ca36f8a40a6211d49e77f84ca37182813fba853fba732e29d18414c739b85f856fd3af702a2cd23174eeaedf2d99a044b0ae0ddea17de7bbb33e3b62cfec5236
这是上面列出的代码生成的长度不正确(127 个字符)的散列:
d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661[=13]
将 while 循环条件从 < 32
更改为 < 128
可以修复它。这是有道理的,因为代码应该产生一个 128 位十六进制数字字符串(512 位),而不是 32 位十六进制数字字符串(128 位)。看来这可能是 OP 代码中列出的错误。
您正在将哈希值转换为十六进制字符串。平均十六分之一的哈希值以二进制 0b0000
开头,这将在十六进制转换中给出前导零,就像 256 分之一的哈希值以 0b00000000
或 0x00
开头一样。检查您的十六进制转换是否没有去除前导零。
我有一个循环遍历并散列的数据点。我正在使用 SHA-512 的 Java 实现来散列我的数据。哈希应该产生一个 128 个字符的字符串,但有时它会产生一个 127 个字符的字符串,这会导致我的代码出现越界异常。
该代码通常会在计算的每 20 个不同哈希值中产生不正确的长度哈希值 1。
这是我用来实现散列的代码,来自 https://www.geeksforgeeks.org/sha-512-hash-in-java/
public static String SHA512(String input)
{
try {
// getInstance() method is called with algorithm SHA-512
MessageDigest md = MessageDigest.getInstance("SHA-512");
// digest() method is called
// to calculate message digest of the input string
// returned as array of byte
byte[] messageDigest = md.digest(input.getBytes());
// Convert byte array into signum representation
BigInteger no = new BigInteger(1, messageDigest);
// Convert message digest into hex value
String hashtext = no.toString(16);
// Add preceding 0s to make it 32 bit
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
// return the HashText
return hashtext;
}
// For specifying wrong message digest algorithms
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
这是上面列出的代码生成的正确长度(128 个字符)的散列: ca36f8a40a6211d49e77f84ca37182813fba853fba732e29d18414c739b85f856fd3af702a2cd23174eeaedf2d99a044b0ae0ddea17de7bbb33e3b62cfec5236
这是上面列出的代码生成的长度不正确(127 个字符)的散列: d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661[=13]
将 while 循环条件从 < 32
更改为 < 128
可以修复它。这是有道理的,因为代码应该产生一个 128 位十六进制数字字符串(512 位),而不是 32 位十六进制数字字符串(128 位)。看来这可能是 OP 代码中列出的错误。
您正在将哈希值转换为十六进制字符串。平均十六分之一的哈希值以二进制 0b0000
开头,这将在十六进制转换中给出前导零,就像 256 分之一的哈希值以 0b00000000
或 0x00
开头一样。检查您的十六进制转换是否没有去除前导零。