首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java SHA-256哈希与预期输出不匹配

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

Stack Overflow用户
提问于 2018-09-23 05:47:46
回答 1查看 1.1K关注 0票数 0

我在一个涉及基本加密货币的项目中遇到了问题。其中一个要求是根据文件中提供的散列检查前一行的散列。因此,从本质上讲,您将计算前一行的SHA-256散列,并与提供的散列进行比较,如果没有提供有效的散列,则抛出异常。

然而,我得到了一个错误,并且我已经将它缩小到实际的散列代码。据我所知,我已经验证了文件是否被正确读入,但是一旦出现将byte[]计算的散列转换为提供的散列的方法,它就会发现它们不等价,并抛出异常。我一直在尝试调试,但我真的不确定问题出在哪里。

我的代码如下。谢谢!

代码语言:javascript
复制
 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;
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-23 09:39:17

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

下次输入log语句或println语句并打印出十六进制哈希值,这样您就可以用眼睛来比较它们了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52461166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档