LWN.net에 따르면, 널리 쓰이고 있는 DVCS(분산버전관리시스템)인 Git에 SHA-256 지원을 추가하기 위한 작업이 현재 진행되고 있다고 합니다.
Git은 원래 2005년에 리누스 토르발즈가 대규모 오픈소스 프로젝트인 리눅스 커널의 버전 관리를 하기 위에 비교적 짧은 기간 안에 만든 DVCS입니다. Git은 내부적으로 모든 것을 SHA-1 해시값으로 봅니다. 예를 들면 Git에서 파일의 내용을 저장하는 객체는 BLOB(Binary Large OBject)이라고 하는데, 여기에는 파일 이름 같은 정보는 하나도 없이 160비트(16진수 40자)짜리 SHA-1 해시값과 파일의 내용만이 담겨 있습니다. 그리고 파일의 내용을 바꾼 다음 커밋을 하면 기존에 있던 BLOB은 변경되지 않고 새롭게 바뀐 파일의 내용을 담은 BLOB이 새로 생기게 됩니다. 파일이나 디렉터리에 대한 정보를 저장하는 Tree 객체나 커밋 내역을 기록하는 Commit 객체에서도 이 SHA-1 해시값을 기준으로 모든 처리가 이루어집니다.
특정한 해시 알고리즘을 통해 도출되는 해시값은 기본적으로 입력된 내용이 같으면 완전히 똑같은 값이 나오고, 아니라면 단 한 글자만 달라도 완전히 다른 해시값이 나옵니다. 그러나 해시값은 그 길이가 한정되어 있기 때문에, 아주 낮은 확률로 서로 다른 파일이지만 같은 해시값이 나올 가능성이 없는 것은 아니죠. 일반적으로 이 확률은 로또 1등에 몇 번씩 연속으로 당첨될 확률보다도 낮습니다만, SHA-1의 경우 알려진 취약점이 있어서 2017년에 구글이 서로 다른 PDF 파일에서 같은 SHA-1 해시값이 나오게끔 하는 데 성공했습니다. 이렇게 되면 누군가 악의적인 목적으로 어떤 파일을 같은 해시값을 가진 다른 파일로 갈아치워도 눈치챌 수 없다는 보안 취약점이 생기게 되죠. 애초에 리누스 토르발즈는 SHA-1 해시를 Git의 근간으로 생각했던 것인지, Git은 전적으로 SHA-1 해시 알고리즘에 의존하도록 만들어져 있고 다른 해시 알고리즘으로 교체할 수 있도록 설계되지 않았습니다. 그러나 기술 발전으로 SHA-1이 취약해진 이상, 새로운 해시 알고리즘으로 바꾸는 것이 보안상 안전합니다.
지금 Git에 새로 도입하려고 하는 해시 알고리즘은 SHA-256입니다. SHA-256은 SHA-1 다음으로 나온 SHA-2에 속하는 알고리즘인데, 사실 기술적으로는 SHA-1과 SHA-2가 꽤 비슷한 편이기 때문에 SHA-1과 비슷한 약점이 없다는 보장도 없으므로 이를 대체하기 위해 SHA-3이 이미 2015년에 나왔습니다. 그러나 SHA-3은 아직 널리 쓰이지 않고 있으며, 또 이번에 Git의 내부 구조를 바꾸고 나면 새로운 해시 알고리즘을 도입하는 것이 훨씬 수월해진다고 합니다. 어쨌든 지금은 예전 버전과의 호환성을 유지하면서도 새로운 해시 알고리즘을 도입할 수 있게끔 작업하느라 꽤 고생이 많은가 봅니다.