해시 함수
해시 함수는 입력값의 크기와 무관하게 항상 고정된 길이의 출력값을 생성하는 함수이다.
예를 들어 한 글자만 입력해도, 수백 MB짜리 파일을 입력해도 출력값은 항상 일정한 길이이다.
Git에서는 이 해시 값을 객체로 식별하는 ID로 사용한다.
이 ID는 객체의 "내용"에서 직접 생성되기 때문에, 내용이 바뀌면 ID도 바뀐다.
이 원리를 내용 주소 지정(content-addressed storage)이라고 부른다.
Git이 사용하는 해시 함수 : SHA-1
Git은 오랫동안 SHA-1(Secure Hash Algorithm 1) 해시 함수를 사용해 왔다.
- 출력 길이 : 40자리의 16진수 문자열 (160비트)
- 예시 : f5a1c3e0b1b3f95fa3dfb77deee3a6d1c84e4a59
- 동일한 입력값에 대해 항상 같은 해시 출력
- 입력값의 아주 작은 변화도 해시값에 큰 변화를 유발
- 출력값만으로는 원래 입력값을 추론할 수 없다.
이러한 특정 덕분에 Git은 해시값을 기반으로 중복을 제거하고, 변경 여부를 탐지하고, 데이터 무결성까지 보장할 수 있다.
⚠️ SHA-1의 보안 취약점
시간이 지나면서 SHA-1의 충돌 가능성이 현실화되었다.
- 2017년, 구글과 네덜란드 CWI 연구소에서 SHAttered 프로젝트를 통해 실제 SHA-1 충돌 사례를 발표
- 이 공격은 서도 다른 두 입력값이 동일한 SHA-1 해시를 만들어내는 현상으로, 해시 충돌의 실제 가능성을 입증한 첫 사례
- 충돌이 가능하다는 건, 이론적으로 누군가가 Git의 해시값을 조작해 악의적인 리포지토리를 신뢰 가능한 것처럼 위장 할 수도 있다는 의미
Git의 대응 : SHA-256 지원
이 문제에 대응하여 Git은 SHA-1에서 SHA-256으로의 전환 작업을 시작하였다.
Git v2.29(2020.10 release)부터는 SHA-256 기반 저장소를 실험적으로 지원한다.
✅ SHA-256의 특징:
- 출력 길이 : 64자리의 16진수 문자열 (256 비트)
- 훨씬 더 강력한 충돌 저항성
- 현재까지 실제 충돌 사례 없음
❗ 하지만 주의:
- 기존 저장소는 기본적으로 여전히 SHA-1을 사용
- SHA-1과 SHA-256 저장소는 호환되지 않는다. 같은 저장소를 SHA-1과 SHA-256 형식으로 동시에 사용할 수 없다.
🧪 SHA-256 저장소 생성 예시
다음 명령어로 SHA-256 저장소를 새로 생성할 수 있다.
git init --object-format=sha256 |
확인하려면
git rev-parse --show-object-format # 출력 : sha256 |
기존 저장소는 SHA-256 해시 함수 사용으로 전환이 복잡하고 비추천된다.
🛠️ 정리
속성 | SHA-1 | SHA-256 |
길이 | 40자 (160비트) | 64자 (256비트) |
충돌 가능성 | 입증됨 (SHAttered) | 현재까지 없음 |
Git 기본 지원 여부 | 기본 (기존 저장소에 적용) | 선택적 (v2.29+에서 실험적 지원) |
✍️ 마무리
1. Git은 해시 함수를 통해 버전 기록을 안전하게 유지하며, 중복 없이 효율적으로 데이터를 관리하고 있다.
2. 오랜 시간 동안 SHA-1이 Git의 핵심 역할을 해왔지만, 보안 위협에 대응해 SHA-256이라는 새로운 옵션을 도입하였다.
3. Git은 단순히 파일을 저장하는 도구가 아니라, 암호학적으로 안전하게 소스코드를 추적하는 신뢰 가능한 버전 관리 시스템(VCS)이다.
참고
SHAttered
Isn't SHA-1 deprecated? Today, many applications still rely on SHA-1, even though theoretical attacks have been known since 2005, and SHA-1 was officially deprecated by NIST in 2011. We hope our practical attack on SHA-1 will increase awareness and convinc
shattered.io
2) https://www.postype.com/@cpuu/post/580053
Google, SHA-1 해시함수 충돌쌍 공격 발표: CPUU의 Daydreamin'
구글과 네덜란드 CWI 연구소에서 SHA-1 해시함수의 충돌쌍을 생성하는 서비스를 공개하였습니다. 원문 글은 Google Security Blog에 2017년 2월 23일에 업데이트되었습니다. 해당 블로그의 글을 한글화하
www.postype.com
'Git > [인강] Git & Github 실무 활용 완벽 가이드' 카테고리의 다른 글
[Git & Github] 19-1. dangling commit 이란? (0) | 2025.05.02 |
---|---|
[Git & Github] 19. Reflog의 힘 - '사라진' 작업 복구하기 (0) | 2025.05.02 |
[Git & Github] 18. Git의 이면 - 해싱(Hashing)과 객체 (0) | 2025.05.02 |
[Git & Github] 17. 히스토리상의 중요한 순간에 표시하기 (0) | 2025.05.02 |
[Git & Github] 16-2. git push -f (0) | 2025.04.30 |