SHA-1
-1( Secure Hash Algorithm 1은 데이터의 무결성을 검증, 디지털 서명, 인증서, 암호화 프로토콜 등 다양한 보안 응용 분야에서 사용되는 암호학적 해시 함수입니다. 1995년 국립표준기술연구소(NIST)와 국가안국(NSA)에 의해 개발된 SHA-1은 입력된 임의 길이의 데이터를 고정된 160비트(20바이트) 길이의 해시 값(다이제스트)으로 변환하는 기능을 수행합니다. 이 문서에서는 SHA-1의 작동 원리, 역사, 보안 취약점, 그리고 현재의 사용 현황에 대해 설명합니다.
개요
SHA-1은 메시지 다이제스트 알고리즘의 일종으로, 주어진 입력 데이터에 대해 고유한 해시 값을 생성합니다. 이 해시 값은 원본 데이터의 "지문(fingerprint)"과 유사한 역할을 하며, 입력 데이터가 조금만 변경되어도 완전히 다른 해시 값이 생성됩니다. 이러한 특성 덕분에 SHA-1은 파일 무결성 검사, 비밀번호 저장, SSL/TLS 인증서 서명 등에 널리 사용되었습니다.
하지만 2005년 이후로 SHA-1은 여러 보안 공격(특히 충돌 공격)에 취약하다는 것이 입증되었고, 현재는 사용이 권장되지 않는 알고리즘으로 분류됩니다. 대신 SHA-2 또는 SHA-3와 같은 더 안전한 해시 함수가 권장되고 있습니다.
작동 원리
입력 처리
SHA-1은 임의 길이의 메시지를 입력으로 받아 처리합니다. 입력 메시지는 다음 단계를 거칩니다:
- 패딩(Padding): 메시지 길이를 512비트의 배수로 맞추기 위해 패딩을 추가합니다.
- 우선
1 비트를 추가하고, 그 뒤에 0 비트를 연속으로 붙입니다.
-
마지막 64비트에는 원본 메시지의 길이(비트 단위)를 저장합니다.
-
블록 분할: 패딩된 메시지를 512비트 단위의 블록으로 나눕니다.
해시 연산
각 512비트 블록에 대해 다음과 같은 과정을 수행합니다:
- 블록을 16개의 32비트 단어로 분할합니다.
- 이후 80단계의 라운드 연산(round function)을 수행하며, 각 단계에서 비트 연산(AND, OR, XOR, NOT), 순환 시프트 등을 사용합니다.
- 5개의 32비트 초기 해시 값(
H0 ~ H4)을 업데이트하며 최종 다이제스트를 생성합니다.
최종적으로, 5개의 32비트 값이 결합되어 160비트의 해시 값(예: da39a3ee5e6b4b0d3255bfef95601890afd80709)이 출력됩니다.
역사와 발전
- 1993년: 최초의 SHA 알고리즘(SHA-0) 발표, 그러나 곧 취약점 발견.
- 1995년: NSA에 의해 수정된 SHA-1 발표.
- 2005년: 중국의 왕샤오윈(Xiaoyun Wang) 연구팀이 SHA-1에 대한 충돌 공격(Collision Attack)을 성공적으로 수행함. 이는 서로 다른 두 입력이 동일한 해시 값을 가질 수 있음을 의미.
- 2017년: 구글과 CWI 암스테르담 연구진이 SHAttered 공격을 발표. 두 개의 서로 다른 PDF 파일이 동일한 SHA-1 해시를 가지도록 만듦.
- 2020년 이후: 대부분의 주요 브라우저와 CA(인증 기관)가 SHA-1 기반 인증서의 발급 및 신뢰를 중단.
보안 취약점
충돌 공격 (Collision Attack)
SHA-1의 가장 큰 문제는 두 개의 서로 다른 입력이 동일한 해시를 생성할 수 있다는 점입니다. 이는 디지털 서명의 위조, 인증서 위변조 등 심각한 보안 사고로 이어질 수 있습니다.
예를 들어, 공격자가 합법적인 문서와 악성 문서를 만들어 SHA-1 해시를 동일하게 맞추면, 서명된 합법 문서처럼 위장할 수 있습니다.
전방 공격 (Pre-image Attack)
현재로서는 SHA-1에 대한 실용적인 전방 공격(주어진 해시 값에서 원본 메시지를 복원)은 알려져 있지 않으나, 충돌 공격의 존재로 인해 전반적인 신뢰도가 크게 하락했습니다.
사용 현황과 권장 사항
| 용도 |
현재 상태 |
| SSL/TLS 인증서 |
비권장, 대부분의 브라우저에서 경고 또는 차단 |
| Git 저장소 |
여전히 사용 중 (단, 보안 인증에는 사용되지 않음) |
| 비밀번호 해싱 |
절대 사용 금지, 약한 알고리즘 |
| 파일 무결성 검사 |
구형 시스템에서 일부 사용, 새 시스템은 SHA-256 권장 |
⚠️ NIST, IETF, CA/Browser Forum 등 주요 기관은 SHA-1의 사용을 2010년대 중반부터 중단할 것을 권고했으며, 2020년 이후로는 모든 보안 관련 용도에서 완전히 폐기되었습니다.
관련 알고리즘
- SHA-2: SHA-256, SHA-512 등 다양한 변종 존재. 현재 산업 표준.
- SHA-3: Keccak 알고리즘 기반, 구조적으로 SHA-1/2과 다름. 더 높은 보안성 보장.
라운드 함수 상세 구조
SHA-1의 80단계 라운드 연산은 20라운드씩 4개의 그룹으로 나뉘며, 각 그룹마다 서로 다른 논리 함수 $f$를 사용하여 비트 혼합을 수행합니다. 각 라운드에서 사용되는 논리식은 다음과 같습니다.
- 라운드 0~19: $\text{f}(t, a, b, c) = (a \land b) \lor (\neg a \land c)$
- 라운드 20~39: $\text{f}(t, a, b, c) = (a \land b) \lor (a \land c) \lor (b \land c)$
- 라운드 40~59: $\text{f}(t, a, b, c) = a \oplus b \oplus c$
- 라운드 60~79: $\text{f}(t, a, b, c) = (a \land b) \lor (\neg a \land c)$ (라운드 0~19와 동일)
여기서 $\land$는 AND, $\lor$는 OR, $\neg$는 NOT, $\oplus$는 XOR 연산을 의미합니다. 이러한 구조적 차이는 데이터의 확산(Diffusion) 효과를 극대화하여 입력값의 작은 변화가 결과값에 크게 영향을 미치도록 설계되었습니다.
충돌 공격의 수학적 배경과 SHAttered
생일 공격 (Birthday Attack)
SHA-1의 충돌 가능성은 확률론의 '생일 문제(Birthday Problem)'에 기반합니다. 이론적으로 160비트 해시 함수에서 충돌을 찾으려면 $2^{160}$번의 시도가 필요할 것 같지만, 실제로는 생일 공격을 통해 약 $2^{80}$번의 시도만으로도 충돌 쌍을 찾을 확률이 50%에 도달합니다. 이는 특정 해시 값과 일치하는 값을 찾는 '전방 공격'보다 훨씬 적은 연산량으로도 서로 다른 두 입력의 해시 값이 같아지는 지점을 찾을 수 있음을 의미합니다.
SHAttered 공격 사례
2017년 구글과 CWI 암스테르담은 SHA-1의 실질적인 충돌을 증명한 SHAttered 공격을 발표했습니다.
- 공격 방식: 특수하게 설계된 PDF 파일 두 개를 생성하여, 파일의 내용은 서로 다르지만 SHA-1 해시 값은 완전히 동일하게 만들었습니다.
- 예시 파일:
- 파일 A: 일반적인 텍스트가 포함된 PDF 문서.
- 파일 B: 파일 A와 시각적으로는 유사하나 내부 구조(메타데이터 및 바이너리 데이터)가 다른 PDF 문서.
- 결과: $\text{SHA-1}(\text{File A}) = \text{SHA-1}(\text{File B}) = \text{38763676... (동일한 160비트 값)}$
- 시사점: 이 공격은 SHA-1이 더 이상 디지털 서명의 무결성을 보장할 수 없음을 실증적으로 보여주었으며, 공격자가 정상 문서의 서명을 탈취해 악성 문서에 적용할 수 있는 위험성을 경고했습니다.
Git에서의 SHA-1 활용과 전환
내용 주소 지정 가능 저장소 (CAS)
Git은 데이터를 저장할 때 파일 이름이 아닌 파일 내용의 해시 값을 주소로 사용하는 내용 주소 지정 가능 저장소(Content-Addressable Storage) 방식을 채택하고 있습니다. SHA-1은 여기서 객체(Blob, Tree, Commit)의 고유 식별자(ID)를 생성하는 데 사용됩니다. 이는 동일한 내용의 파일이 여러 번 저장되더라도 단 하나의 해시 값으로 관리되어 저장 공간을 효율적으로 사용할 수 있게 합니다.
SHA-256으로의 전환
SHAttered 공격 이후, Git 커뮤니티는 SHA-1의 충돌 가능성이 저장소의 무결성을 해칠 수 있다고 판단하여 SHA-256으로의 전환을 추진하고 있습니다.
* 전환 메커니즘: 기존 SHA-1 기반 저장소와의 호환성을 유지하면서, 새로운 커밋부터 SHA-256을 선택적으로 사용할 수 있는 옵션을 도입하고 있습니다.
* 충돌 방지: Git은 단순 해시 비교 외에도 파일 크기나 추가적인 검증 단계를 통해 SHA-1 충돌로 인한 데이터 오염을 방지하는 보완책을 적용하고 있습니다.
SHA-1과 다른 해시 함수의 성능 비교
SHA-1은 보안성은 낮지만, 연산 구조가 단순하여 최신 알고리즘보다 처리 속도가 빠릅니다. 이는 과거 하드웨어 성능이 낮았던 시절에 큰 장점으로 작용했습니다.
| 알고리즘 |
해시 길이 |
보안 수준 |
상대적 연산 속도 |
주요 특징 |
| MD5 |
128-bit |
매우 낮음 |
매우 빠름 |
가장 빠르나 충돌 공격에 매우 취약 |
| SHA-1 |
160-bit |
낮음 |
빠름 |
속도와 보안의 타협점이었으나 현재는 취약 |
| SHA-256 |
256-bit |
높음 |
보통 |
현재 표준, SHA-1보다 연산 복잡도 높음 |
| SHA-512 |
512-bit |
매우 높음 |
보통/빠름* |
64비트 CPU 환경에서 SHA-256보다 효율적 |
*SHA-512는 64비트 아키텍처에서 32비트 기반의 SHA-256보다 처리 효율이 더 좋을 수 있습니다.
참고 자료
결론
SHA-1은 과거 중요한 역할을 했던 해시 알고리즘이지만, 보안 취약성이 입증됨에 따라 현재는 사용해서는 안 되는 알고리즘입니다. 특히 보안이 중요한 시스템에서는 반드시 SHA-2(예: SHA-256) 이상의 알고리즘을 사용해야 하며, 새로운 시스템 설계 시 SHA-1은 배제되어야 합니다. 기술 발전과 함께 알고리즘의 수명 주기를 이해하고, 적절한 시기에 업그레이드하는 것이 사이버 보안의 핵심입니다.
# SHA-1
-1( Secure Hash Algorithm 1은 데이터의 무결성을 검증, 디지털 서명, 인증서, 암호화 프로토콜 등 다양한 보안 응용 분야에서 사용되는 **암호학적 해시 함수**입니다. 1995년 국립표준기술연구소(NIST)와 국가안국(NSA)에 의해 개발된 SHA-1은 입력된 임의 길이의 데이터를 고정된 160비트(20바이트) 길이의 해시 값(다이제스트)으로 변환하는 기능을 수행합니다. 이 문서에서는 SHA-1의 작동 원리, 역사, 보안 취약점, 그리고 현재의 사용 현황에 대해 설명합니다.
## 개요
SHA-1은 **메시지 다이제스트 알고리즘**의 일종으로, 주어진 입력 데이터에 대해 고유한 해시 값을 생성합니다. 이 해시 값은 원본 데이터의 "지문(fingerprint)"과 유사한 역할을 하며, 입력 데이터가 조금만 변경되어도 완전히 다른 해시 값이 생성됩니다. 이러한 특성 덕분에 SHA-1은 파일 무결성 검사, 비밀번호 저장, SSL/TLS 인증서 서명 등에 널리 사용되었습니다.
하지만 2005년 이후로 SHA-1은 여러 **보안 공격**(특히 충돌 공격)에 취약하다는 것이 입증되었고, 현재는 **사용이 권장되지 않는 알고리즘**으로 분류됩니다. 대신 SHA-2 또는 SHA-3와 같은 더 안전한 해시 함수가 권장되고 있습니다.
---
## 작동 원리
### 입력 처리
SHA-1은 임의 길이의 메시지를 입력으로 받아 처리합니다. 입력 메시지는 다음 단계를 거칩니다:
1. **패딩**(Padding): 메시지 길이를 512비트의 배수로 맞추기 위해 패딩을 추가합니다.
- 우선 `1` 비트를 추가하고, 그 뒤에 `0` 비트를 연속으로 붙입니다.
- 마지막 64비트에는 원본 메시지의 길이(비트 단위)를 저장합니다.
2. **블록 분할**: 패딩된 메시지를 512비트 단위의 블록으로 나눕니다.
### 해시 연산
각 512비트 블록에 대해 다음과 같은 과정을 수행합니다:
- 블록을 16개의 32비트 단어로 분할합니다.
- 이후 80단계의 **라운드 연산**(round function)을 수행하며, 각 단계에서 비트 연산(AND, OR, XOR, NOT), 순환 시프트 등을 사용합니다.
- 5개의 32비트 초기 해시 값(`H0` ~ `H4`)을 업데이트하며 최종 다이제스트를 생성합니다.
최종적으로, 5개의 32비트 값이 결합되어 **160비트의 해시 값**(예: `da39a3ee5e6b4b0d3255bfef95601890afd80709`)이 출력됩니다.
---
## 역사와 발전
- **1993년**: 최초의 SHA 알고리즘(SHA-0) 발표, 그러나 곧 취약점 발견.
- **1995년**: NSA에 의해 수정된 **SHA-1** 발표.
- **2005년**: 중국의 왕샤오윈(Xiaoyun Wang) 연구팀이 SHA-1에 대한 **충돌 공격**(Collision Attack)을 성공적으로 수행함. 이는 서로 다른 두 입력이 동일한 해시 값을 가질 수 있음을 의미.
- **2017년**: 구글과 CWI 암스테르담 연구진이 **SHAttered 공격**을 발표. 두 개의 서로 다른 PDF 파일이 동일한 SHA-1 해시를 가지도록 만듦.
- **2020년 이후**: 대부분의 주요 브라우저와 CA(인증 기관)가 SHA-1 기반 인증서의 발급 및 신뢰를 중단.
---
## 보안 취약점
### 충돌 공격 (Collision Attack)
SHA-1의 가장 큰 문제는 **두 개의 서로 다른 입력이 동일한 해시를 생성할 수 있다**는 점입니다. 이는 디지털 서명의 위조, 인증서 위변조 등 심각한 보안 사고로 이어질 수 있습니다.
예를 들어, 공격자가 합법적인 문서와 악성 문서를 만들어 SHA-1 해시를 동일하게 맞추면, 서명된 합법 문서처럼 위장할 수 있습니다.
### 전방 공격 (Pre-image Attack)
현재로서는 SHA-1에 대한 실용적인 전방 공격(주어진 해시 값에서 원본 메시지를 복원)은 알려져 있지 않으나, 충돌 공격의 존재로 인해 전반적인 신뢰도가 크게 하락했습니다.
---
## 사용 현황과 권장 사항
| 용도 | 현재 상태 |
|------|-----------|
| SSL/TLS 인증서 | **비권장**, 대부분의 브라우저에서 경고 또는 차단 |
| Git 저장소 | 여전히 사용 중 (단, 보안 인증에는 사용되지 않음) |
| 비밀번호 해싱 | **절대 사용 금지**, 약한 알고리즘 |
| 파일 무결성 검사 | 구형 시스템에서 일부 사용, 새 시스템은 SHA-256 권장 |
> ⚠️ **NIST, IETF, CA/Browser Forum** 등 주요 기관은 SHA-1의 사용을 2010년대 중반부터 중단할 것을 권고했으며, 2020년 이후로는 모든 보안 관련 용도에서 **완전히 폐기**되었습니다.
---
## 관련 알고리즘
- **SHA-2**: SHA-256, SHA-512 등 다양한 변종 존재. 현재 산업 표준.
- **SHA-3**: Keccak 알고리즘 기반, 구조적으로 SHA-1/2과 다름. 더 높은 보안성 보장.
---
## 라운드 함수 상세 구조
SHA-1의 80단계 라운드 연산은 20라운드씩 4개의 그룹으로 나뉘며, 각 그룹마다 서로 다른 논리 함수 $f$를 사용하여 비트 혼합을 수행합니다. 각 라운드에서 사용되는 논리식은 다음과 같습니다.
* **라운드 0~19**: $\text{f}(t, a, b, c) = (a \land b) \lor (\neg a \land c)$
* **라운드 20~39**: $\text{f}(t, a, b, c) = (a \land b) \lor (a \land c) \lor (b \land c)$
* **라운드 40~59**: $\text{f}(t, a, b, c) = a \oplus b \oplus c$
* **라운드 60~79**: $\text{f}(t, a, b, c) = (a \land b) \lor (\neg a \land c)$ (라운드 0~19와 동일)
여기서 $\land$는 AND, $\lor$는 OR, $\neg$는 NOT, $\oplus$는 XOR 연산을 의미합니다. 이러한 구조적 차이는 데이터의 확산(Diffusion) 효과를 극대화하여 입력값의 작은 변화가 결과값에 크게 영향을 미치도록 설계되었습니다.
## 충돌 공격의 수학적 배경과 SHAttered
### 생일 공격 (Birthday Attack)
SHA-1의 충돌 가능성은 확률론의 '생일 문제(Birthday Problem)'에 기반합니다. 이론적으로 160비트 해시 함수에서 충돌을 찾으려면 $2^{160}$번의 시도가 필요할 것 같지만, 실제로는 **생일 공격**을 통해 약 $2^{80}$번의 시도만으로도 충돌 쌍을 찾을 확률이 50%에 도달합니다. 이는 특정 해시 값과 일치하는 값을 찾는 '전방 공격'보다 훨씬 적은 연산량으로도 서로 다른 두 입력의 해시 값이 같아지는 지점을 찾을 수 있음을 의미합니다.
### SHAttered 공격 사례
2017년 구글과 CWI 암스테르담은 SHA-1의 실질적인 충돌을 증명한 **SHAttered** 공격을 발표했습니다.
* **공격 방식**: 특수하게 설계된 PDF 파일 두 개를 생성하여, 파일의 내용은 서로 다르지만 SHA-1 해시 값은 완전히 동일하게 만들었습니다.
* **예시 파일**:
* **파일 A**: 일반적인 텍스트가 포함된 PDF 문서.
* **파일 B**: 파일 A와 시각적으로는 유사하나 내부 구조(메타데이터 및 바이너리 데이터)가 다른 PDF 문서.
* **결과**: $\text{SHA-1}(\text{File A}) = \text{SHA-1}(\text{File B}) = \text{38763676... (동일한 160비트 값)}$
* **시사점**: 이 공격은 SHA-1이 더 이상 디지털 서명의 무결성을 보장할 수 없음을 실증적으로 보여주었으며, 공격자가 정상 문서의 서명을 탈취해 악성 문서에 적용할 수 있는 위험성을 경고했습니다.
## Git에서의 SHA-1 활용과 전환
### 내용 주소 지정 가능 저장소 (CAS)
Git은 데이터를 저장할 때 파일 이름이 아닌 파일 내용의 해시 값을 주소로 사용하는 **내용 주소 지정 가능 저장소(Content-Addressable Storage)** 방식을 채택하고 있습니다. SHA-1은 여기서 객체(Blob, Tree, Commit)의 고유 식별자(ID)를 생성하는 데 사용됩니다. 이는 동일한 내용의 파일이 여러 번 저장되더라도 단 하나의 해시 값으로 관리되어 저장 공간을 효율적으로 사용할 수 있게 합니다.
### SHA-256으로의 전환
SHAttered 공격 이후, Git 커뮤니티는 SHA-1의 충돌 가능성이 저장소의 무결성을 해칠 수 있다고 판단하여 **SHA-256**으로의 전환을 추진하고 있습니다.
* **전환 메커니즘**: 기존 SHA-1 기반 저장소와의 호환성을 유지하면서, 새로운 커밋부터 SHA-256을 선택적으로 사용할 수 있는 옵션을 도입하고 있습니다.
* **충돌 방지**: Git은 단순 해시 비교 외에도 파일 크기나 추가적인 검증 단계를 통해 SHA-1 충돌로 인한 데이터 오염을 방지하는 보완책을 적용하고 있습니다.
## SHA-1과 다른 해시 함수의 성능 비교
SHA-1은 보안성은 낮지만, 연산 구조가 단순하여 최신 알고리즘보다 처리 속도가 빠릅니다. 이는 과거 하드웨어 성능이 낮았던 시절에 큰 장점으로 작용했습니다.
| 알고리즘 | 해시 길이 | 보안 수준 | 상대적 연산 속도 | 주요 특징 |
| :--- | :---: | :---: | :---: | :--- |
| **MD5** | 128-bit | 매우 낮음 | 매우 빠름 | 가장 빠르나 충돌 공격에 매우 취약 |
| **SHA-1** | 160-bit | 낮음 | 빠름 | 속도와 보안의 타협점이었으나 현재는 취약 |
| **SHA-256** | 256-bit | 높음 | 보통 | 현재 표준, SHA-1보다 연산 복잡도 높음 |
| **SHA-512** | 512-bit | 매우 높음 | 보통/빠름* | 64비트 CPU 환경에서 SHA-256보다 효율적 |
*\*SHA-512는 64비트 아키텍처에서 32비트 기반의 SHA-256보다 처리 효율이 더 좋을 수 있습니다.*
## 참고 자료
- [NIST FIPS 180-4: Secure Hash Standard](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf)
- [SHAttered: The First Practical Collision for SHA-1](https://shattered.io)
- [RFC 3174: US Secure Hash Algorithm 1 (SHA1)](https://tools.ietf.org/html/rfc3174)
---
## 결론
SHA-1은 과거 중요한 역할을 했던 해시 알고리즘이지만, **보안 취약성이 입증됨에 따라 현재는 사용해서는 안 되는 알고리즘**입니다. 특히 보안이 중요한 시스템에서는 반드시 **SHA-2**(예: SHA-256) 이상의 알고리즘을 사용해야 하며, 새로운 시스템 설계 시 SHA-1은 배제되어야 합니다. 기술 발전과 함께 알고리즘의 수명 주기를 이해하고, 적절한 시기에 업그레이드하는 것이 사이버 보안의 핵심입니다.