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에서 사용할 수 있습니다 .