[java] Java에서 파일의 MD5 체크섬 가져 오기

Java를 사용하여 파일의 MD5 체크섬을 얻으려고합니다. 정말 놀랐지 만 파일의 MD5 체크섬을 얻는 방법을 보여주는 것을 찾을 수 없었습니다.

어떻게 되나요?



답변

입력 스트림 데코레이터 java.security.DigestInputStream가있어 데이터를 추가로 전달하지 않고 입력 스트림을 정상적으로 사용하면서 다이제스트를 계산할 수 있습니다.

MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"));
     DigestInputStream dis = new DigestInputStream(is, md))
{
  /* Read decorated stream (dis) to EOF as normal... */
}
byte[] digest = md.digest();


답변

Apache Commons 코덱 라이브러리 에서 DigestUtils 를 사용하십시오 .

try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {
    String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}


답변

MessageDigest 클래스 사용 하는 Real의 Java-How-to 예제가 있습니다 .

a

CRC32 및 SHA-1을 사용한 예제도 해당 페이지를 확인하십시오.

import java.io.*;
import java.security.MessageDigest;

public class MD5Checksum {

   public static byte[] createChecksum(String filename) throws Exception {
       InputStream fis =  new FileInputStream(filename);

       byte[] buffer = new byte[1024];
       MessageDigest complete = MessageDigest.getInstance("MD5");
       int numRead;

       do {
           numRead = fis.read(buffer);
           if (numRead > 0) {
               complete.update(buffer, 0, numRead);
           }
       } while (numRead != -1);

       fis.close();
       return complete.digest();
   }

   // see this How-to for a faster way to convert
   // a byte array to a HEX string
   public static String getMD5Checksum(String filename) throws Exception {
       byte[] b = createChecksum(filename);
       String result = "";

       for (int i=0; i < b.length; i++) {
           result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
       }
       return result;
   }

   public static void main(String args[]) {
       try {
           System.out.println(getMD5Checksum("apache-tomcat-5.5.17.exe"));
           // output :
           //  0bb2827c5eacf570b6064e24e0e6653b
           // ref :
           //  http://www.apache.org/dist/
           //          tomcat/tomcat-5/v5.5.17/bin
           //              /apache-tomcat-5.5.17.exe.MD5
           //  0bb2827c5eacf570b6064e24e0e6653b *apache-tomcat-5.5.17.exe
       }
       catch (Exception e) {
           e.printStackTrace();
       }
   }
}


답변

com.google.common.hash의 API 제공 :

  • 모든 해시 함수를위한 통합 된 사용자 친화적 API
  • murmur3의 시드 가능한 32 비트 및 128 비트 구현
  • md5 (), sha1 (), sha256 (), sha512 () 어댑터는 한 줄의 코드 만 변경하여 이들 사이를 전환합니다.
  • goodFastHash (int bits), 사용하는 알고리즘에 신경 쓰지 않을 때
  • CombineOrdered / CombineUnorder와 같은 HashCode 인스턴스의 일반 유틸리티

사용자 안내서 ( IO Explained , Hashing Explained )를 읽으십시오 .

사용 사례의 경우 Files.hash()파일의 다이제스트 값을 계산하고 반환합니다.

예를 들어 다이제스트 계산 (MD-1 다이제스트를 얻기 위해 SHA-1을 MD5로 변경)

HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();

참고 보다 훨씬 빠르다 그래서 사용하십시오 암호로 안전한 체크섬이 필요하지 않은 경우 또한 암호 사용을 위해 무차별 대입하기 쉽기 때문에 암호 등을 저장하는 데 사용해서는 안됩니다 , 또는 대신에.

해시를 사용한 장기 보호의 경우 Merkle 서명 체계 가 보안에 추가되며 유럽위원회가 후원하는 Post Quantum Cryptography Study Group은 양자 컴퓨터 ( ref ) 에 대한 장기 보호를 위해이 암호화를 사용할 것을 권장했습니다 .

참고 다른 것보다 충돌 률이 높습니다.


답변

외부 라이브러리없이 nio2 (Java 7+) 사용 :

byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("MD5").digest(b);

결과를 예상 체크섬과 비교하려면

String expected = "2252290BC44BEAD16AA1BF89948472E8";
String actual = DatatypeConverter.printHexBinary(hash);
System.out.println(expected.equalsIgnoreCase(actual) ? "MATCH" : "NO MATCH");


답변

구아바는 이제 JDK에서 제공되는 다양한 해싱 API보다 훨씬 사용자 친화적 인 새롭고 일관된 해싱 API를 제공합니다. 해싱 설명을 참조하십시오 . 파일의 경우 MD5 합계, CRC32 (버전 14.0 이상) 또는 기타 여러 해시를 쉽게 얻을 수 있습니다.

HashCode md5 = Files.hash(file, Hashing.md5());
byte[] md5Bytes = md5.asBytes();
String md5Hex = md5.toString();

HashCode crc32 = Files.hash(file, Hashing.crc32());
int crc32Int = crc32.asInt();

// the Checksum API returns a long, but it's padded with 0s for 32-bit CRC
// this is the value you would get if using that API directly
long checksumResult = crc32.padToLong();


답변

확인. 나는 추가해야했다. Spring과 Apache Commons에 이미 의존하거나 추가 할 계획 인 사람들을위한 한 줄 구현 :

DigestUtils.md5DigestAsHex(FileUtils.readFileToByteArray(file))

For Apache Apache Commons Only 옵션 (credit @duleshi) :

DigestUtils.md5Hex(FileUtils.readFileToByteArray(file))

이것이 누군가를 돕기를 바랍니다.