반응형
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
반응형