해시 SHA1은 어떤 길이의 데이터든 160비트 고정 길이 값으로 변환하는 암호학적 해시 함수입니다. 결과는 40자리 16진수 문자열로 표현되며, 파일 무결성 검증과 버전 관리 시스템의 식별자로 오랫동안 쓰여 왔습니다. 다만 2017년 실제 충돌 사례가 공개된 뒤로 사용 가능한 범위가 크게 달라졌습니다. 어디까지 써도 되고 어디부터는 안 되는지, 기준을 정확히 알아두면 불필요한 보안 사고를 막을 수 있습니다.
해시 SHA1의 정의와 네 가지 성질
SHA1은 1995년 미국 NIST가 표준으로 채택한 해시 알고리즘입니다. 입력 데이터를 받아 계산한 결과를 다이제스트라고 부르며, 다음 네 가지 성질을 가집니다.
- 고정 길이 출력: 1바이트를 넣든 10GB 영상 파일을 넣든 결과는 언제나 40자리 16진수입니다.
- 단방향성: 해시값만 보고 원본 데이터를 역산할 수 없습니다. 암호화와 달리 복호화 개념이 존재하지 않습니다.
- 눈사태 효과: 입력에서 단 한 비트만 바뀌어도 출력값 전체가 완전히 다른 모습으로 변합니다.
- 결정성: 같은 입력은 어떤 기기, 어떤 언어로 계산해도 항상 동일한 값을 냅니다.
실제 예를 보면 이해가 빠릅니다. 빈 문자열의 SHA1 값은 da39a3ee5e6b4b0d3255bfef95601890afd80709이고, 문자열 hello의 값은 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d입니다. 이 값들은 전 세계 어디서 계산해도 동일하기 때문에, 파일이 전송 도중 손상되지 않았는지 확인하는 용도로 널리 쓰였습니다.
SHA1이 값을 만들어 내는 3단계
내부 동작을 알면 왜 입력 크기와 무관하게 같은 길이가 나오는지 납득이 됩니다. 계산 과정은 크게 세 단계로 나뉩니다.
- 패딩: 원본 데이터 뒤에 1비트와 0비트를 채워 512비트 블록의 배수로 맞춥니다. 마지막 64비트 자리에는 원본의 실제 길이를 기록해 둡니다.
- 압축: 32비트 레지스터 다섯 개를 정해진 초기값으로 세팅한 뒤, 각 512비트 블록마다 80라운드에 걸쳐 비트 회전과 논리 연산, 덧셈을 반복합니다. 이전 블록의 결과가 다음 블록 계산에 그대로 이어지는 구조입니다.
- 연결: 모든 블록 처리가 끝난 뒤 남은 다섯 개 레지스터 값을 순서대로 이어 붙이면 160비트, 40자리 16진수 결과가 완성됩니다.
직접 확인하려면 별도 프로그램이 필요 없습니다. 리눅스와 맥은 sha1sum 파일명 또는 shasum -a 1 파일명, 윈도우는 certutil -hashfile 파일명 SHA1 명령으로 바로 값을 얻을 수 있습니다. 문자열 단위로 여러 알고리즘 결과를 나란히 대조해 보고 싶다면 해시 생성기를 활용하면 브라우저에서 즉시 비교할 수 있어 편리합니다.
MD5, SHA256과 비교한 3가지 차이점
세 알고리즘은 자주 함께 언급되지만 쓰임새가 명확히 갈립니다. 출력 길이, 충돌 저항성, 처리 속도 세 축으로 정리하면 다음과 같습니다.
| 구분 | MD5 | SHA1 | SHA256 |
|---|---|---|---|
| 출력 길이 | 128비트 (32자) | 160비트 (40자) | 256비트 (64자) |
| 발표 연도 | 1992년 | 1995년 | 2001년 |
| 충돌 저항성 | 완전히 붕괴 (수 초 내 생성) | 붕괴 (2017년 실증) | 현재까지 안전 |
| 상대 속도 | 가장 빠름 | MD5보다 다소 느림 | SHA1의 약 60~70% 수준 |
| 권장 용도 | 보안 무관한 체크섬만 | 레거시 호환, 중복 탐지 | 서명, 인증서, 무결성 검증 |
속도 차이는 과거만큼 결정적이지 않습니다. 최근 CPU 대부분이 SHA 확장 명령어를 하드웨어로 지원하기 때문에, SHA256이 SHA1보다 오히려 빠르게 처리되는 환경도 흔합니다. 성능을 이유로 SHA1을 고집할 근거가 사실상 사라진 셈입니다.
보안 용도에서 SHA1이 퇴출된 이유
결정적인 사건은 2017년 구글과 CWI 암스테르담이 공개한 SHAttered 연구입니다. 내용이 서로 다른 두 개의 PDF 파일이 완전히 동일한 SHA1 값을 갖도록 만드는 데 성공했습니다. 이론적 취약점 지적을 넘어 실물 파일로 충돌이 증명된 것입니다.
2019년에는 접두사를 자유롭게 지정할 수 있는 선택 접두사 충돌 기법이 발표되었고, 2020년 기준 클라우드 자원을 빌려 수만 달러 규모로 재현할 수 있는 수준까지 비용이 내려갔습니다. 이 때문에 주요 브라우저는 2017년을 전후로 SHA1 서명 TLS 인증서 신뢰를 모두 철회했습니다.
지금도 SHA1을 써도 되는 경우
충돌이 뚫렸다고 해서 모든 용도가 금지되는 것은 아닙니다. 판단 기준은 단순합니다. 공격자가 입력값을 조작할 수 있는 상황인지 여부입니다.
- 계속 써도 되는 경우: 내부 시스템의 중복 파일 탐지, 캐시 키 생성, 변경 감지용 지문 등 악의적 조작 가능성이 없는 식별 목적
- 즉시 교체해야 하는 경우: 전자 서명, 인증서, 소프트웨어 배포 검증, 토큰 발급, 다운로드 무결성 확인 등 신뢰를 담보하는 모든 영역
Git이 여전히 SHA1을 커밋 식별자로 쓰는 이유도 여기에 있습니다. 저장소 무결성을 해시 하나에만 의존하지 않고, 충돌 탐지 로직을 별도로 내장해 두었기 때문입니다. 실제로 Git은 SHA256 기반 저장소 포맷으로 전환하는 작업을 오래전부터 진행해 왔습니다.
새로 설계하는 시스템이라면 선택은 간단합니다. 일반적인 무결성 검증과 서명에는 SHA256을 기본값으로 잡고, 메시지 인증이 필요하면 HMAC-SHA256을 사용하면 됩니다. 기존 코드에서 SHA1을 걷어낼 때는 저장된 해시값을 한 번에 재계산할 수 없는 경우가 많으므로, 알고리즘 식별자를 값 앞에 붙여 두고 점진적으로 전환하는 방식이 안전합니다.