컴퓨터/자질구레 팁

MD5로 데이터의 무결성 확인

adnoctum 2013. 1. 21. 15:27




   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 정도 되는지라 중간에 잘 못 받았는지를 확인하는 부분이 필요하긴 하다, ㅋ.