오픈소스 프로그램을 다운로드했더니 공식 사이트에 "SHA-256: 3a7bd..."라는 문자열이 적혀 있다. 이걸 대체 어디에 쓰라는 건지 처음에는 의미를 몰랐다. 알고 보니 내가 받은 파일이 원본과 동일한지 확인하는 "디지털 지문"이었다.
해시값은 디지털 지문이다
해시 함수는 어떤 데이터를 넣든 고정된 길이의 문자열로 변환하는 알고리즘이다. 같은 입력에는 항상 같은 결과가 나오고, 입력이 1비트만 달라져도 결과가 완전히 바뀐다.
예시
"안녕하세요"의 SHA-256:c30cf96...
"안녕하세오"의 SHA-256:7f2e1a...
한 글자만 바꿨는데 결과가 완전히 다르다.
이 특성 때문에 파일이 변조되었는지 확인하는 용도로 쓰인다. 다운로드한 파일의 해시값을 계산해서 공식 사이트에 적힌 값과 비교하면, 중간에 누군가 악성코드를 심었는지 바로 알 수 있다.
해시 알고리즘별 차이
| 알고리즘 | 출력 길이 | 보안 수준 | 주요 용도 |
|---|---|---|---|
| MD5 | 128비트 (32자) | 취약 (충돌 발견됨) | 파일 체크섬 (비보안용) |
| SHA-1 | 160비트 (40자) | 취약 (2017년 충돌 실증) | Git 커밋 해시 (레거시) |
| SHA-256 | 256비트 (64자) | 안전 | SSL/TLS, 비트코인, 전자서명 |
| SHA-512 | 512비트 (128자) | 매우 안전 | 고보안 시스템, 인증서 |
MD5는 속도가 빠르지만 2004년에 충돌(서로 다른 입력이 같은 해시값을 갖는 현상)이 발견되어 보안 용도로는 더 이상 권장되지 않는다. 현재 업계 표준은 SHA-256이다.
해시가 실제로 쓰이는 곳
파일 무결성 검증
리눅스 ISO 파일이나 드라이버를 공식 사이트에서 다운로드하면 옆에 해시값이 적혀 있다. 다운로드 후 해시를 계산해서 값이 같으면 파일이 온전한 것이고, 다르면 전송 중 깨졌거나 변조된 것이다.
비밀번호 저장
제대로 된 서비스는 비밀번호를 원문 그대로 저장하지 않는다. 해시로 변환한 값만 저장하고, 로그인할 때 입력된 비밀번호의 해시와 저장된 해시를 비교한다. 데이터베이스가 유출되어도 원래 비밀번호를 역산하기 어렵다.
블록체인
비트코인의 모든 블록은 SHA-256 해시로 연결되어 있다. 이전 블록의 해시가 다음 블록에 포함되는 구조라, 중간 블록 하나를 조작하면 뒤따르는 모든 블록의 해시가 바뀌면서 변조가 즉시 드러난다.
해시값 확인하는 법
텍스트나 파일의 해시를 구하려면 명령어를 쓸 수도 있지만 번거롭다. 해시 생성기에 텍스트를 입력하거나 파일을 끌어다 놓으면 MD5부터 SHA-512까지 다섯 가지 해시값이 한꺼번에 나온다. 해시 비교 기능도 있어서, 두 값을 붙여넣으면 일치 여부를 바로 알려준다. 파일이 서버로 전송되지 않고 브라우저에서만 처리되기 때문에 민감한 파일도 안심하고 확인할 수 있다.