Git은 파일과 커밋의 변경 사항을 고유하게 식별하기 위해 40자리의 16진수 문자열을 생성하기 위해 SHA-1(secure hash algorithm 1) 해싱 알고리즘을 사용한다.
예를 들어 "Hello, World!"라는 텍스트를 SHA-1 해시로 변환하면 다음과 같은 해시 값을 생성한다. 이 해시 값은 Git에서 각 파일과 커밋에 대한 식별자 역할을 한다.
0a0a9f2a6772942557ab5355d76af442f8f65e01
해시 충돌의 실제성
해시 충돌은 두 개 이상의 입력이 동일한 해시 값을 생성하는 경우를 의미한다. 이는 이론적으로는 가능하지만 실제로 발생할 확률은 극히 낮다. SHA-1 알고리즘이 생성할 수 있는 해시 값의 수가 대략 1.46 * 10^48개에 달하기 때문에 해시 충돌이 발생할 확률은 거의 없다고 볼 수 있다.
그래도 해시 충돌은 발생할 수 있다
이론적으로 해시 충돌이 발생할 가능성은 존재한다. 실제로 2017년에 SHA 공격을 통해 시연된 바 있다.
만약 Git은 해시 충돌이 발생하면 해당 충돌을 일으킨 새로운 커밋을 거부한다. 이는 Git의 핵심 원칙 중 하나인 데이터 무결성을 보호하기 위한 것이다.
해시 충돌은 해시 충돌 탐지 오픈소스(SHA-1 Collision Detection)를 사용해서 탐지할 수 있다.
앞으로는?
Git도 이 문제에 대해 인지하고 2018년에 이미 SHA-1보다 강력한 SHA-256 알고리즘으로 마이그레이션을 결정했다고 한다.
2023년 현재는 아직 SHA-1을 사용하고 있지만, 앞으로는 SHA-256으로 마이그레이션된다면 해시 충돌에서 조금 더 안전해질 수 있을 것이다. (사실 지금도 우리는 걱정할 필요는 없다.)
참고
- https://stackoverflow.com/questions/10434326/hash-collision-in-git
- https://git-scm.com/docs/hash-function-transition