2017-11-29 6 views
0

同じチェックサム生成方法(SHA-256)を持つ2つのプログラムがあります。 違いは、最初のプログラムではパスが(windowspath/folder/file)、2番目のパスでは(./folder/file)です。ここ コードである:同じアルゴリズムでチェックサムを生成すると異なる出力が返される

プログラム1

String address = fileAddr.getText(); 
          File file = new File(address); 
          try 
           { 
            checksum = getChecksum(file.getAbsolutePath()); 
            data = generateByte(address); 

           } 
          catch (NoSuchAlgorithmException | IOException e1) 
           { 
            // TODO Auto-generated catch block 
            e1.printStackTrace(); 
           } 

チェックサム生成方法

public static String getChecksum(Serializable object) throws IOException, NoSuchAlgorithmException 
     { 
      ByteArrayOutputStream baos = null; 
      ObjectOutputStream oos = null; 
      System.out.println(object.toString()); 
      try 
       { 
        baos = new ByteArrayOutputStream(); 
        oos = new ObjectOutputStream(baos); 
        oos.writeObject(object); 
        MessageDigest md = MessageDigest.getInstance("SHA-256"); 
        byte[] thedigest = md.digest(baos.toByteArray()); 
        return DatatypeConverter.printHexBinary(thedigest); 
       } 
      finally 
       { 
        oos.close(); 
        baos.close(); 
       } 
     } 

プログラム2

File folder = new File(".\\Plugins"); 
File[] listOfFiles = folder.listFiles(); 
listChecksum.add(getChecksum(listOfFiles[i].getPath())); 

問題はタイトルに記載されているとおり、2つのチェックサムは一致しません。

+0

は、あなたも、どのようにハッシュ世代の仕事を知っていますか:

私は、チェックサムを生成する関数でファイルの内容を読むことをお勧めでしょうか?申し訳ありませんが、私が傲慢だがハッシュ(SHA-256で作られたハッシュも同じ)という音は、同じファイルでは常に同じものです。 – IndieDev

答えて

2

あなたはファイル名を比較するだけで、ファイルの内容を読んでいないと思います。これらは確かに異なるので、異なるチェックサム値が得られます。

public class Main { 

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException { 
     Path x = Paths.get("D:\\work\\some.zip"); 
     System.out.println(getChecksum(x)); 
    } 

    public static String getChecksum(Path path) throws IOException, NoSuchAlgorithmException { 
     byte[] bytes = Files.readAllBytes(path); 
     MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     byte[] thedigest = md.digest(bytes); 
     return Base64.getEncoder().encodeToString(thedigest); 
    } 

} 
+0

これを修正するにはどうすればよいですか? – IndieDev

+0

@IndieDev更新された回答を参照してください。 –

関連する問題