하루한줄 코딩일기
[Git] Git의 해시 알고리즘 본문
Git에서 해시함수를 사용하는 이유
Git의 commit ID는 왜 해시값일까?
깃을 사용하던 중 커밋 아이디가 SHA-1 해시값으로 되어 있는 것을 보고 문득 왜 ID를 해싱 하는건지 궁금해졌다. 서치를 해봤지만 이 내용에 대한 자료는 많지 않았다. 그러다 발견한 재미있는 글 :
요약하자면 다음과 같다. 깃은 오프라인 상태나 서버가 연결되어 있지 않은 상태에서도 사용이 가능해야 한다. 그런데 만약 1, 2, 3과 같은 순차적인 정수형 ID를 부여한다면, 커밋 ID를 지정할 때 이전 번호는 뭐였는지 서버에서 확인 작업이 필요하게 된다. 따라서 깃은 최신 번호 확인이 불필요하고, 중복이 없는 해시값을 커밋 ID로 사용한다.
나는 해시값의 고유성 관점에서만 생각했었는데, 상상하지 못한 신선한 내용이었다. 하지만 이게 전부일까? 깃에서 해시함수를 사용하는게 단지 이 이유 때문만은 아닐 것 같아 또 폭풍 서치를 하다가, 깃 개발자 리누스 토발즈가 깃에서의 SHA-1 사용에 대해 언급한 영상을 찾았다. 이 영상은 커밋 ID 뿐만 아니라 전반적인 깃에서의 해시 사용에 대해 이야기 하는 것 같지만 이것 또한 궁금해서 알아봤다.
리누스 토발즈가 말하는 SHA-1의 목적 (56:25)
http://www.youtube.com/watch?v=4XpnKHJAok8&t=56m25s
해당 영상에서 리누스 토발즈는 깃에서의 SHA-1은 보안적 요소보다는 자료의 신뢰성과 일관성 체크를 위함이라고 말한다. 'SHA-1을 사용하면 데이터를 trust할 수 있다'라고 강력하게 얘기하는데, 데이터를 신뢰할 수 있다는 건 무슨 뜻일까? 데이터를 깃에 올려두면, 다른 곳으로 이리저리 데이터를 옮기더라도 몇년이 지나서 데이터를 꺼냈을 때 그건 정확히 내가 올린 바로 그 데이터! 라는 것을 신뢰할 수 있다는 것이다. 글자 한토시라도 바뀌면 해시값이 달라지니, 해시값만 알고 있으면 데이터의 무결성이 보장된다는 의미로 이해했다.
결론: SHA-1은 보안적 요소로 사용한 것이 아닌, 자료의 consistency check과 reliability를 위해 사용했다. (그런데 따지고 보면 이것도 무결성 보장이라는 보안적 측면 아닌가? 왜 보안과는 무관하다고 하는 건지 사실 이해가 잘 안된다.) 아무튼, 가장 좋은 SHA고 아무도 SHA-1을 깬 적이 없기 때문에 믿고 쓸 수 있다고 하는데, 여기서 갑자기 엥? 싶어서 날짜를 보니 14년 전 연설이었다.. 화질 보고 깨달았어야 했는데 🤦🏻♀️
그렇다면 또 궁금해졌다. 시간이 지나며 보안적으로 SHA-1보다 강력한 해시 알고리즘들이 나왔다. 또한 2017년 구글이 SHA-1 해시 충돌에 성공하면서 SHA-1은 더 이상 안전한 해시 알고리즘이라고 할 수 없게 되었다. 그런데 깃은 그동안 왜 계속해서 SHA-1을 사용한 걸까?
더 강력한 해시 알고리즘으로 바꾸지 않은 이유
찾아보니 작년 10월 출시된 Git 2.29 버전 부터는 SHA-256을 지원한다고 한다! 근데 왜 이제서야? (사사건건 시비걸기)
윗 글에 따르면 그 이유는 다음과 같다. 데이터에 아주 작은 변화만 생겨도 새로운 해시값이 생성되는데, 그렇다면 버전 관리 도구인 깃에는 어마어마하게 많은 양의 해시값들이 저장되어 있을 것이다. 2018년에는 자그마치 1억 개가 넘는 레포가 있었다고 한다. 이 데이터를 전부 새 해시 알고리즘으로 전환하는 것은 보통 일이 아닐 것이다.
깃은 차차 SHA-256로 완전히 전환할 예정이라고 한다. 깃에서 내놓은 SHA 전환 목표는 윗 글에서 볼 수 있다. 목표 완료 날짜에 대한 말은 없었다고 한다.
'Git' 카테고리의 다른 글
[Git/GitHub] GitHub에 로컬 저장소의 프로젝트 올리기 (0) | 2022.01.28 |
---|---|
[Git/GitHub] GitHub 원격 저장소의 커밋 삭제하기 (0) | 2021.09.03 |
[Git/GitHub] GH001: Large files detected (2) | 2021.09.02 |