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 예제가 있습니다 .
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()
파일의 다이제스트 값을 계산하고 반환합니다.
예를 들어 샤 -1 다이제스트 계산 (MD-1 다이제스트를 얻기 위해 SHA-1을 MD5로 변경)
HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();
참고 crc32 보다 훨씬 빠르다 md5그래서 사용하십시오 crc32암호로 안전한 체크섬이 필요하지 않은 경우 또한md5 암호 사용을 위해 무차별 대입하기 쉽기 때문에 암호 등을 저장하는 데 사용해서는 안됩니다 막다, 암호화 또는 샤 -256 대신에.
해시를 사용한 장기 보호의 경우 Merkle 서명 체계 가 보안에 추가되며 유럽위원회가 후원하는 Post Quantum Cryptography Study Group은 양자 컴퓨터 ( ref ) 에 대한 장기 보호를 위해이 암호화를 사용할 것을 권장했습니다 .
참고 crc32 다른 것보다 충돌 률이 높습니다.
답변
외부 라이브러리없이 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))
이것이 누군가를 돕기를 바랍니다.