어떤 사이트들에 가 보면 MD5라고 써있고, 이상한 문자열이 있는 것을 볼 수 있다.

다운이 이상없이 됐는지 체크하는 용도로 사용하는 문자열이다.

예컨대, 아래 그림을 참고해 보자.

아래쪽에 체크섬파일이라고 적혀있는 게 보일 거다. 클릭해서 들어가보면 아래처럼 나온다.

0237e41023e4a077a41b6b3210619d0b cobuntu-9.10_1-desktop-i386.iso

원리에 대한 설명은 나중에 하고, 다음을 따라해 보자.

파일을 다 다운받았다면, 터미널을 연다.

다운받은 디렉토리로 이동해서 다음 명령어를 쳐본다.

openssl dgst -md5 cobuntu-9.10_1-desktop-i386.iso

위에서 -md5 다음 부분은 당연히 파일명이고, 파일명에 따라 변하는 거다. 착각하지 마시길.

자, 그러면 시간이 좀 흐른 후에 문자열이 나온다.

MD5(cobuntu-9.10_1-desktop-i386.iso)= 0237e41023e4a077a41b6b3210619d0b

이렇게 말이다.

그러면 보자… 0237e41023e4a077a41b6b3210619d0b가 위에서 본 문자열이랑 같은지 비교해 보면 되는 거다. 문자열이 같으면, 파일이 오류없이 온전히 받아졌다는 것을 확신할 수 있다.

이 결과값을 해시(hash) 값, 해시 체크썸(checksum) 혹은 간단하게 해시라고 부른다.

MD5 체크섬 원리

오늘 코분투를 다운받는데, 체크섬이 있길래 나도 활용해 보고 싶어서 적어 봤다.

MD5는 단방향 암호화 기법이다. MD5 함수는 수학적인 알고리즘을 돌려, 어떤 값을 집어넣어도 위처럼 32개의 알파벳과 숫자로 변환해서 뽑아 주는 함수다. 같은 값을 넣으면 반드시 같은 값이 반환되며, 서로 다른 값을 넣었을 때 같은 값이 반환될 확률은 제로에 가깝다. 결과값을 통해 원본값을 알아내는 것은 (이론상) 불가능하다.

단방향 암호화기 때문에 암호를 풀 수 있는 키 같은 건 존재하지 않는다. 무조건 모든 값을 넣어보는 수밖에 없다.

사소한 차이만 있어도 반환되는 문자열은 아래처럼 천지차이다.

123 :  202cb962ac59075b964b07152d234b70
123. : d375af34cc08aba9a1cc9b6596a70c36

위는 123과 123.을 각각 MD5 단방향 암호화 알고리즘으로 암호화한 것이다. 완전히 다른 결과값이 나왔다는 것을 알 수 있다.

이렇게 같은 값을 집어넣으면 반드시 같은 값을 반환하게 돼 있는 단방향 해시 알고리즘의 특성을 이용해 파일에 손상(해킹을 포함)이 있는지를 확인하는 게 바로 MD5 체크섬이다(무결성 검사).

패스워드 검사 용도로 사용하기에는 부적합

MD5 해시 값을 역산해 원본값을 알아내려면 모든 값을 넣어 봐야 하기 때문에 개발 당시인 1991년에는 아주 오래 걸렸다고 하는데… 지금은 아니다. 취약점도 발견됐다고 하는데 그것까지는 모르겠고 단순히만 생각해도 그 사이 컴퓨터의 성능이 비약적으로 발전했기 때문이다.

만약 무결성 검사 용도가 아니라 로그인 패스워드 저장 용도로 단방향 암호화 알고리즘을 하려면 MD5나 sha256보다는 bcrypt나 argon2 같은 것을 사용하는 편이 좋다.

무결성 검사에는 MD5도 사용되는데, 역설적으로 연산에 필요한 자원이 적어 대용량 파일의 무결성을 검사하기에 좋기 때문일 것이다.