Java SHA-512函数仅产生508位输出?
我有一个循环和散列的数据点。我正在使用SHA-512的Java实现来散列数据。散列应该产生一个128个字符的字符串,但有时它会产生一个127个字符的字符串,这会导致我的代码出现越界异常 代码通常会在每计算20个不同的哈希值中产生一个不正确的长度哈希值1 这是我用来实现散列的代码,它来自Java SHA-512函数仅产生508位输出?,java,string,substring,sha,sha512,Java,String,Substring,Sha,Sha512,我有一个循环和散列的数据点。我正在使用SHA-512的Java实现来散列数据。散列应该产生一个128个字符的字符串,但有时它会产生一个127个字符的字符串,这会导致我的代码出现越界异常 代码通常会在每计算20个不同的哈希值中产生一个不正确的长度哈希值1 这是我用来实现散列的代码,它来自 公共静态字符串SHA512(字符串输入) { 试试{ //使用算法SHA-512调用getInstance()方法 MessageDigest md=MessageDigest.getInstance(“SH
公共静态字符串SHA512(字符串输入)
{
试试{
//使用算法SHA-512调用getInstance()方法
MessageDigest md=MessageDigest.getInstance(“SHA-512”);
//调用digest()方法
//计算输入字符串的消息摘要
//作为字节数组返回
byte[]messageDigest=md.digest(input.getBytes());
//将字节数组转换为符号表示
BigInteger否=新的BigInteger(1,messageDigest);
//将消息摘要转换为十六进制值
字符串hashtext=no.toString(16);
//添加前面的0使其成为32位
而(hashtext.length()<32){
hashtext=“0”+hashtext;
}
//返回哈希文本
返回hashtext;
}
//用于指定错误的消息摘要算法
catch(nosuchalgorithme){
抛出新的运行时异常(e);
}
}
下面是由上面列出的代码生成的正确长度(128个字符)的哈希:
CA36F8A40A6211D49E77F84CA37182813FBA853FBA732E29D18414C739B85F856FD3AF702A2CD23174EEAEDF2D99A044B0AE0DDEA17DE7BB33E3B62CFEC5236
下面是由上面列出的代码生成的长度不正确(127个字符)的哈希:
d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661将while循环条件从
<32
更改为<128
将其修复。这是有意义的,因为代码应该生成128个十六进制数字字符串(512位),而不是32个十六进制数字字符串(128位)。似乎这可能是OP代码中列出的错误。您正在将哈希转换为十六进制字符串。平均每十六个哈希中就有一个以二进制0b0000
开头,这将在十六进制转换中给出前导零,就像每256个哈希中就有一个以0b00000000
或0x00
开头一样。检查十六进制转换是否没有去掉前导零。IIRC,Java的MessageDigest不会填充。因此,您必须提供填充,否则将填充两位长度的全部功率。谢谢您的评论。填充哈希值的好方法是什么?我使用这段代码是为了区块链的目的,我不确定用0填充字符串的开头是否是个好主意,因为这正是我的区块链程序试图挖掘的。
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);
}
}