Java SHA-256 哈希与预期输出不匹配
Java SHA-256 Hash Not Matching Expected Output
我对涉及基本加密货币的项目有疑问。其中一项要求是根据文件中提供的哈希检查前一行的哈希。因此,从本质上讲,您将计算上一行的 SHA-256 哈希值,与提供的哈希值进行比较,如果未提供有效哈希值,则抛出异常。
但是,我遇到了错误,我已将错误范围缩小到实际的散列代码。据我所知,我已经验证文件被正确读取,但是一旦出现将 byte[]
计算的哈希值转换为提供的哈希值的方法,它发现它们不等价并抛出异常。我一直在尝试调试,但我真的不确定问题出在哪里。
我的代码如下。谢谢!
if (block_line == null && block_hash == "0")
{
return true; //genesis block, special hash
}
//remove new lines and tabs
block_line = block_line.replaceAll("\r\n", "");
byte[] hash = null;
byte[] file_hash = block_hash.getBytes();
try
{
//create SHA-256 hash of raw line to ensure following hash is correct
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(block_line.getBytes());
hash = md.digest();
}
catch (NoSuchAlgorithmException nsaex)
{
System.err.println("No SHA-256 algorithm found.");
System.err.println("This generally should not happen...");
System.exit(1);
}
//check if the hash in the file was valid for the line in question
try
{
if (Arrays.equals(hash, file_hash))
{
return true; //file hash is valid
}
else
{
throw new InvalidDataException(block_hash, 0);
}
}
catch (InvalidDataException ide)
{
System.err.println("InvalidDataException: " + ide);
ide.printStackTrace();
System.err.println("Quitting...");
return false;
}
block_hash
似乎可能包含一个 编码的 十六进制摘要值(或者可能是 base 64)。使用 getBytes
你只是得到该字符串的标准编码:它不会解码十六进制或基数 64。当你比较字节数组时,二进制 hash
值与二进制 file_hash
包含 编码的 摘要。因此比较将失败(如果只是因为摘要的大小不同)。
下次输入日志语句或 println
语句并打印出十六进制哈希值,以便您可以肉眼比较它们。
我对涉及基本加密货币的项目有疑问。其中一项要求是根据文件中提供的哈希检查前一行的哈希。因此,从本质上讲,您将计算上一行的 SHA-256 哈希值,与提供的哈希值进行比较,如果未提供有效哈希值,则抛出异常。
但是,我遇到了错误,我已将错误范围缩小到实际的散列代码。据我所知,我已经验证文件被正确读取,但是一旦出现将 byte[]
计算的哈希值转换为提供的哈希值的方法,它发现它们不等价并抛出异常。我一直在尝试调试,但我真的不确定问题出在哪里。
我的代码如下。谢谢!
if (block_line == null && block_hash == "0")
{
return true; //genesis block, special hash
}
//remove new lines and tabs
block_line = block_line.replaceAll("\r\n", "");
byte[] hash = null;
byte[] file_hash = block_hash.getBytes();
try
{
//create SHA-256 hash of raw line to ensure following hash is correct
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(block_line.getBytes());
hash = md.digest();
}
catch (NoSuchAlgorithmException nsaex)
{
System.err.println("No SHA-256 algorithm found.");
System.err.println("This generally should not happen...");
System.exit(1);
}
//check if the hash in the file was valid for the line in question
try
{
if (Arrays.equals(hash, file_hash))
{
return true; //file hash is valid
}
else
{
throw new InvalidDataException(block_hash, 0);
}
}
catch (InvalidDataException ide)
{
System.err.println("InvalidDataException: " + ide);
ide.printStackTrace();
System.err.println("Quitting...");
return false;
}
block_hash
似乎可能包含一个 编码的 十六进制摘要值(或者可能是 base 64)。使用 getBytes
你只是得到该字符串的标准编码:它不会解码十六进制或基数 64。当你比较字节数组时,二进制 hash
值与二进制 file_hash
包含 编码的 摘要。因此比较将失败(如果只是因为摘要的大小不同)。
下次输入日志语句或 println
语句并打印出十六进制哈希值,以便您可以肉眼比较它们。