반응형

MD5의 역사


  • 128비트 암호화 해시 함수이다.
  • 프로그램이나 파일이 원본 그대로인지 확인하는 무결성 검사에 사용된다.
  • MD4를 대체하기 위해 고안 되었따.

MD5의 결함 발생

  • 1996년 설계상 결함 발생
  • 2004년 암호화 결함 발견

현재는 보안 관련 용도로 쓰는 것은 권장되지 않고, 심각한 문제를 야기할 수 있다.
예로 2008년 12월에 MD5 결함을 이용해서 SSL 인증서를 변조하는 것이 가능하다는 발표가 있었다.

암호 학자들은 SHA-1과 같이 다른 안전한 알고리즘을 사용할 것을 권장한다.

MD5를 Java에서 사용하기


문자열 변환

@Test
void 문자열_MD5로_변환() throws NoSuchAlgorithmException {
  // given
  String md5Hash = "8C2221D82E92AC4EEA9E4444DB0222F4";
  String password = "dugi";

  // when
  MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(password.getBytes());

  byte[] digest = md5.digest();
  String myHash = DatatypeConverter.printHexBinary(digest)
      .toUpperCase();

  // then
  assertThat(myHash).isEqualTo(md5Hash);
}

Not Thread-Safe

@Test
void not_thread_safe() throws NoSuchAlgorithmException {
  // given
  MessageDigest digest1 = MessageDigest.getInstance("MD5");
  MessageDigest digest2 = MessageDigest.getInstance("MD5");

  assertThat(digest1).isNotSameAs(digest2);
}

파일 변환

@Test
void 파일을_MD5로_변환() throws IOException, NoSuchAlgorithmException {
  String imageUrl = "src/test/java/io/bigin/ads/core/dugi/md5_img.png";
  byte[] fileBytes = Files.readAllBytes(Paths.get(imageUrl));

  MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(fileBytes);
  byte[] digest = md5.digest();
  String s = DatatypeConverter.printHexBinary(digest).toUpperCase();

  System.out.println("s = " + s);
}

스프링이 제공하는 MD5 사용하기

스프링에 있을 것이라는 것을 당연히 고려했어야 했는데 무지성으로 구글링해서 예제만 보고 작성했다.
다행히 리뷰를 받아 스프링이 제공하는 MD5를 알게 되었다.

public static String Md5(byte[] bytes) {
  return DigestUtils.md5DigestAsHex(bytes).toUpperCase();
}

참고 자료


https://devnata.tistory.com/91
https://ko.wikipedia.org/wiki/MD5

반응형
복사했습니다!