SHA Hashing在Java中意外地表现 - 代码提供

时间:2015-11-14 19:46:13

标签: java hash sha256

读取文件然后使用SHA-256对其进行散列我找到了tutorial,它显示了两种不同的方法。

将我散列的文件(哪个是PDF)与两种方法进行比较时,它们不匹配。我正在正确地遵循代码,不理解它为什么不匹配。

这是我的结果:

Hex format: b050692edb134da209adf76347f6c5e49db8734edeaa44876606ec8e5559ab4e
Hex format: b050692edb134da29adf76347f6c5e49db8734edeaa4487666ec8e5559ab4e

看起来它正在中间掉掉两个零,我只是不明白为什么

Java代码

import java.io.FileInputStream;
import java.security.MessageDigest;

public class SHAHash{
   public static void main(String[] args)throws Exception{
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      FileInputStream fis = new FileInputStream("myfile");

      byte[] dataBytes = new byte[1024];
      int nread = 0;
      while((nread = fis.read(dataBytes))!= -1){
         md.update(dataBytes, 0, nread);
      };

      byte[] mdbytes = md.digest();

      StringBuffer sb1 = new StringBuffer();
      for(int i = 0; i < mdbytes.length; i++){
        sb1.append(Integer.toString((mdbytes[i] & 0xFF) + 0x100, 16).substring(1));
      }
      System.out.println("Hex format: " + sb1.toString());

      StringBuffer sb2 = new StringBuffer();
      for(int i = 0; i < mdbytes.length; i++){
         sb2.append(Integer.toHexString(0xFF & mdbytes[i]));
      }
      System.out.println("Hex format: " + sb2.toString());
   }
}

2 个答案:

答案 0 :(得分:2)

而不是StringBuffer你应该使用StringBuilder(方法不同步,你不是使用多个线程,它就像一个{之间的区别{1}}和Vector)。此外,您需要保留前导ArrayList(s)。您可以使用String.format(String, Object...)之类的内容更正第二个循环。将它们放在一起就像,

0

答案 1 :(得分:0)

两者之间的区别在于第一个添加0x100,然后只接受子字符串。

这样,第一个循环中的toString调用总是返回一个前导1后跟实际值的字符串。这样就可以保留零。

第二个循环产生错误的输出,因为零位丢失。