본문 바로가기
컴퓨터/자질구레 팁

MD5로 데이터의 무결성 확인

by adnoctum 2013. 1. 21.




   MD5는 정해진 길이를 갖는 message digest이다. message digest 란, 일종의 지문이라고 보면 된다. 원리의 복잡성에 비해 구현 자체는 어렵지 않기 때문에 위키 등에 C 로 된 코드가 있으며, linux 에서는 기본적으로 md5sum 이란 명령어로 제공이 되고 있다. C를 제외한 다른 언어에서도 아마 대부분 모듈이나 라이브러리로 제공이 될 것이다. 


   MD5는 메세지 digest 로서, 특정 byte stream 이나 문자열을 입력하였을 때 그것의 수학적 변형에 의해 정해진 길이의 output 이 나오게 해주는 알고리즘으로, 일종의 지문이라고 보면 된다. 즉, 파일에 대한 MD5가 알려져 있을 때, 그 파일을 네트웍을 통하여 전송받은 후 다시 MD5를 계산했을 때 만약 두 MD5가 다르다면 중간에 파일 내용이 손상이 된 것이다. 크기가 변하지 않고, 중간에 한두 bit 만 바뀌어도 MD5는 변하게 된다. 이런 식으로 이미 알려진 MD5가 있으면 파일의 무결성을 확인하기 위해 MD5를 사용할 수 있다. 


   MD5가 데이터의 무결성만을 보장하기 위한 것은 아니고, 주로 보안 쪽에서 많이 이용된다. 실제로 어떤 식으로 이용되는지 내가 잘 알지는 못하겠는데, 예전에 암호를 저장해 놓을 때 나는 입력받은 암호의 MD5값을 파일에 저장 후, 나중에 암호를 확인할 일이 있을 때 그 당시 받은 암호의 MD5를 계산해서 파일에 저장해 놓은 MD5와 같은지를 확인했었다.


   그런데 위의 경우, 서로 다른 두 문자열에 대하여 같은 MD5가 나올 가능성이 있다. 물론 아주 희박한 확률이긴 하지만 보안 쪽에서는 이런 것이 중요해서 MD5보다 좀 더 이런 확률이 적은 SHA2 같은 것이 제안되었고, 이 역시 리눅스에서는 sha512sum 과 같은 명령어로 계산할 수 있다. 





예전에 내가 했던 것도 실은 MD5가 아니라 sha256 아니면 sha512 였다. 그런데 지금 사용하는 싸이트에서 파일에 대한 md5를 주고 있기 때문에 어쩔 수 없이 md5를 써서 download 받은 file의 integrity 를 확인하고 있다. 원래는 이 routine 을 작성할 필요성은 느꼈지만 귀찮아서 안했는데, 중간에 download 받는 와중에 파일 하나를 못 받는 것을 보고, 귀찮아도 구현을 했지... 보통 수십개를 받고, 전체 용량이 5~10GB 정도 되는지라 중간에 잘 못 받았는지를 확인하는 부분이 필요하긴 하다, ㅋ.