Java SHA-256哈希与预期输出不匹配

时间:2018-09-22 21:47:46

标签: java cryptography sha cryptocurrency

我遇到一个涉及基本加密货币的项目的问题。要求之一是对照文件中提供的哈希检查上一行的哈希。因此,从本质上讲,您将计算前一行的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;
 }

1 个答案:

答案 0 :(得分:0)

block_hash似乎包含以十六进制(或可能以64为底)的编码摘要值。使用getBytes只能得到该字符串的标准编码:它不会对十六进制或基数64进行解码。当比较字节数组时,会将二进制hash的值与二进制{{1 }},其中包含编码的摘要。因此,比较将失败(如果仅仅是因为摘要的大小不同)。

下一次放入log语句或file_hash语句并打印出十六进制哈希值,以便您可以通过肉眼进行比较。