md5를 해부해보다.

오늘 2주전부터 계획해오던 해쉬(Hash) 세미나를 했다.

세미나의 부주제는 MD5 였다.

mining the web 이라는 책을 보면 md5는 문서 중복 검사에 쓰일 수 있다고 나온다. 그리고 실제 내가 실무를 그동안 해오면서 알게 모르게 md5를 써왔었던게 사실이다.

뭐 튜플로 (h(u), v), (h(u’), v’)의 형식으로 문서의 지문을 추출해서 그 지문을 키로 사용해 문서의 중복 여부를 판단하는데 이곳에는 조금의 문제가 있긴 하다. 왜냐면 문서에서 구석의 작은 날짜만 바뀌더라도 hash값은 영 다른게 나와버리기 때문이다. 그래서 실무에서는 숫자를 제거한 text만으로 해싱을 해서 쓰기도 하지만 여러 다른 방법이 mining the web에는 나와 있다. (edit distance나 q-gram방법 등등)

이야기가 어디로 셌는데…

md5는 대략 이렇다.

전체 데이터를 512비트의 블록으로 나누고 512비트의 한 블록을 32비트서브블록 16개로 나누어 각 블록의 데이터를 이용해 initial register 값 a,b,c,d 를 업데이트 해나간다. 각 512비트 블록한개에서 레지스터 각각은 4번씩 업데이트 되는 격이다.(그러나 sha-1 알고리즘은 12번의 업데이트를 한다. 그래서 보안성이 더 좋다 한다)
처음부터 모든 메시지 블록들을 거치며 변환된 a,b,c,d 값에 다시 initial register값을 더한 것이 md5 해싱 값이다.

512비트 단위로 연산하기 때문에 연산시 모든 데이터를 로딩할 필요가 없어서 대용량 데이터를 해싱하는데 좋지만 한계는 2^64 정도의 길이 데이터가 한계이다.(해싱 파일 분할시 마지막 512비트의 마지막 64 비트에 데이터 길이 정보를 추가로 넣는다. 이걸로 한계가 정해진건가??)

간단하게 말하면 initial register값 a,b,c,d를 데이터를 비롯 비트연산, sin(i) 값을 등등을 이용해 계속 업데이트 해나가는 것이다. 32비트 연산이 기반이기 때문에 요즘 PC에서 빠르게 돌아가는 장점이 있다.

그런데 알고리즘을 분석하면서 왜 이게 충돌이 적게 일어나는 알고리즘인지 잘 이해가 안간다. 여러 문서를 보면 +연산과 clock wise 쉬프트 연산 그리고 불린 연산을 조합하는게 보안성이 좋다라고만 연구결과로 나와 있기는 하다. 그치만 솔직히 피부에 와닿지 않기는 매한가지이다. ㅡㅡ;

대안으로 나온 sha-1은 160비트로 해싱을 하는데 md5보다 속도는 떨어지지만 더 충돌이 덜 나는 해싱을 값을 가져온다는 연구 결과도 있다. sha-256, sha-512 등등 충돌을 예상한다면 위의 sha 계열을 쓰던가 md5를 재해싱하는 방법을 사용하는게 좋을거 같다.

재미있는 사내 세미나 이만 정리 끝.~~~~~

ps. 재미난 해싱 함수 있으면 코멘트 달아주심 좋아할겁니다. ^^;

0 0 votes
Article Rating
Subscribe
Notify of
guest

5 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
최종욱

Effective Java에도 이런 저런 필드에 13을 곱하는 무식한 녀석이 있습니다 (대략 난감)

고감자

나름 의미가 있을겁니다.
이펙티브 자바에도 해쉬에 대한 설명이 있었던걸로 기억나네요.

ddanzi

왜 여자들이 시집갈때 전화번호를바꿔?
난 여잔데 시집가기때문에 번호바꾸는거 한번도 못봤는데?
싫은사람들 전화 안받을려고 전화번호 바꿨어.
난 세상 피곤하게 사는게 제일 싫거든.
난 바빠죽겠지만 운동도하고 데이트도하고 잘지내~

너도 잘 지네라…

율대리

sha-1 은 ms 제공 함수라 리눅스 계열은 안되지 않나? 우리도 sha-1 쓰는뎅

고감자

이거 공개되어 있습니다. md5 처럼요….

알고리즘 조차 공개가 되어 있구요.

여러 https 프로토콜 에서조차 선택적으로 sha-1 알고리즘을 사용하고 있습니다.