为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2021-10-06 09:52:07
我在涉及基本加密货币的项目中遇到问题。要求之一是根据文件中提供的散列检查前一行的散列。因此,本质上,您将计算前一行的 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 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

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

下次输入日志语句或println语句并打印出十六进制哈希值,以便您可以通过肉眼进行比较。


查看完整回答
反对 回复 2021-10-06
  • 1 回答
  • 0 关注
  • 261 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信