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

我在涉及基本加密货币的项目中遇到问题。要求之一是根据文件中提供的散列检查前一行的散列。因此,本质上,您将计算前一行的 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;

 }


呼啦一阵风
浏览 262回答 1
1回答

万千封印

似乎block_hash包含十六进制编码的摘要值(或可能是基数 64)。使用getBytes您只需获得该字符串的标准编码:它不会解码十六进制或基数 64。当您比较字节数组时,二进制hash值将与file_hash包含编码摘要的二进制值进行比较。因此比较将失败(如果仅仅是因为摘要的大小不同)。下次输入日志语句或println语句并打印出十六进制哈希值,以便您可以通过肉眼进行比较。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java