1. 개요
MD5는 널리 사용되는 암호화 해시 함수로 128 비트의 해시를 생성합니다.
이 기사에서는 다양한 Java 라이브러리를 사용하여 MD5 해시 를 생성하는 다양한 접근 방식을 살펴 봅니다 .
2. MessageDigest 클래스를 사용하는 MD5
java.security.MessageDigest 클래스 에는 해싱 기능 이 있습니다 . 아이디어는 먼저 인수로 사용할 알고리즘의 종류로 MessageDigest 를 인스턴스화 하는 것입니다.
MessageDigest.getInstance(String Algorithm)
그런 다음 update () 함수를 사용하여 메시지 다이제스트를 계속 업데이트합니다 .
public void update(byte [] input)
위의 함수는 긴 파일을 읽을 때 여러 번 호출 할 수 있습니다. 마지막으로 digest () 함수를 사용하여 해시 코드를 생성해야합니다.
public byte[] digest()
다음은 암호에 대한 해시를 생성 한 다음 확인하는 예입니다.
@Test
public void givenPassword_whenHashing_thenVerifying()
throws NoSuchAlgorithmException {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] digest = md.digest();
String myHash = DatatypeConverter
.printHexBinary(digest).toUpperCase();
assertThat(myHash.equals(hash)).isTrue();
}
마찬가지로 파일의 체크섬을 확인할 수도 있습니다.
@Test
public void givenFile_generatingChecksum_thenVerifying()
throws NoSuchAlgorithmException, IOException {
String filename = "src/test/resources/test_md5.txt";
String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(filename)));
byte[] digest = md.digest();
String myChecksum = DatatypeConverter
.printHexBinary(digest).toUpperCase();
assertThat(myChecksum.equals(checksum)).isTrue();
}
우리는 것을 인식 할 필요가 MessageDigest 등은 스레드로부터 안전하지 않습니다 . 따라서 모든 스레드에 대해 새 인스턴스를 사용해야합니다.
3. Apache Commons를 사용하는 MD5
org.apache.commons.codec.digest.DigestUtils의 클래스는 상황이 훨씬 간단합니다.
암호 해싱 및 확인에 대한 예를 살펴 보겠습니다.
@Test
public void givenPassword_whenHashingUsingCommons_thenVerifying() {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
String md5Hex = DigestUtils
.md5Hex(password).toUpperCase();
assertThat(md5Hex.equals(hash)).isTrue();
}
4. Guava를 사용하는 MD5
다음은 com.google.common.io.Files.hash를 사용하여 MD5 체크섬을 생성하기 위해 따를 수있는 또 다른 방법입니다 .
@Test
public void givenFile_whenChecksumUsingGuava_thenVerifying()
throws IOException {
String filename = "src/test/resources/test_md5.txt";
String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";
HashCode hash = com.google.common.io.Files
.hash(new File(filename), Hashing.md5());
String myChecksum = hash.toString()
.toUpperCase();
assertThat(myChecksum.equals(checksum)).isTrue();
}
주의, Hashing.md5가 되지 않습니다. 그러나 공식 문서에서 알 수 있듯이 Security 문제를 위해 일반적으로 MD5를 사용하지 않도록 권장하기위한 것입니다. 이는 예를 들어 MD5가 필요한 레거시 시스템과 통합해야하는 경우에도이 방법을 사용할 수 있음을 의미합니다. 그렇지 않으면 SHA-256 과 같은 더 안전한 옵션을 고려하는 것이 좋습니다 .
5. 결론
Java API 및 Apache commons 및 Guava와 같은 기타 타사 API에서 MD5 해시를 생성하는 방법에는 여러 가지가 있습니다. 프로젝트의 요구 사항과 프로젝트가 따라야하는 의존성에 따라 현명하게 선택하십시오.
항상 그렇듯이 코드는 Github에서 사용할 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/java-md5
'Java' 카테고리의 다른 글
스프링 배치로 스프링 부트 (0) | 2021.03.24 |
---|---|
자바에서 바이너리 트리 구현 (0) | 2021.03.24 |
Java의 접기 기술에 대한 사용방법(예제) (0) | 2021.03.24 |
Spring과 함께하는 Jooq 소개 (0) | 2021.03.23 |
Spring 속성 파일에서 배열 및 List 삽입 (0) | 2021.03.23 |