Git은 왜 암호화 해시 기능을 사용합니까?


139

Git 이 더 빠른 비 암호 해시 함수 대신 암호화 해시 함수 SHA-1을 사용하는 이유는 무엇 입니까?

관련 질문 :

스택 오버플로 질문 Git은 왜 SHA-1을 버전 번호로 사용합니까? Git이 커밋을 위해 순차적 인 숫자 대신 SHA-1을 사용하는 이유를 묻습니다.


개인적으로 SHA-2보다 깨진 SHA-1을 사용하는 것조차 조기에 최적화되었다고 생각합니다.
코드 InChaos

7
@CodesInChaos : 게다가, 특정 알고리즘을 코드에 굽는 것은 DI 원칙에 대한 끔찍한 위반이었습니다. XML 설정 파일에 있어야합니다 ;-)
Steve Jessop

Git 2.16 (2017 년 1 분기)으로 2017 년 12 월 업데이트 : 대체 SHA를 지원하려는 노력이 진행 중입니다. " Git이 왜 최신 SHA를 사용하지 않습니까? "를 참조하십시오.
VonC

아무 없습니다 좋은 160 비트 이상의 비 암호 해시. 대부분은 고도로 최적화 된 32 비트, 64 비트 또는 128 비트 기능입니다. 128 비트는 괜찮지 만 git과 같은 큰 프로젝트에서는 128 비트가 약간 낮습니다. 빠른 고품질 224/256 비트 해시가 나온다면 아마도 이상적 일 것입니다.
bryc

답변:


197

TLDR;


당신은에서 그것을 확인할 수 있습니다 리누스 토발즈 (Linus Torvalds) 자신, 그가 2007 년에 구글의 뒷면에 힘내을 발표 할 때 :
(강조 광산)

암호로 안전한 것으로 간주되는 체크섬을 확인합니다. 아무도 SHA-1을 깰 수 없었지만 요점은 git에 관한 한 SHA-1은 보안 기능조차 아닙니다. 순전히 일관성 검사 입니다.
보안 부품은 다른 곳에 있습니다. 많은 사람들이 git이 SHA-1을 사용하고 SHA-1이 암호로 안전한 것들에 사용되기 때문에 거대한 보안 기능이라고 생각합니다. 그것은 보안과 전혀 관련이 없으며 얻을 수있는 최고의 해시 일뿐입니다.

좋은 해시가 있으면 데이터를 신뢰할 수 있고 다른 좋은 기능도 있습니다. 객체를 해시하면 해시가 잘 분산되어 있음을 알고 특정 배포 문제에 대해 걱정할 필요가 없습니다. .

내부적으로는 구현 관점에서 해시가 너무 좋아서 해싱 알고리즘을 사용할 수 있으며 나쁜 경우가 없다는 것을 알 수 있습니다.

따라서 암호화 측면도 좋아할만한 이유가 있지만 실제로는 데이터를 신뢰할 수있는 기능에 관한 것입니다.
데이터를 git에 넣으면 5 년 후 하드 디스크에서 DVD로 변환 한 후 새로운 기술로 복사 한 후 5 년 후에 데이터를 확인할 수 있다는 사실을 신뢰할 수 있습니다. 다시 가져 오는 것은 정확히 같은 데이터입니다. 그리고 그것은 소스 코드 관리 시스템에서 실제로 찾아야 할 것입니다 .


Git 2.16 (2017 년 1 분기)으로 2017 년 12 월 업데이트 : 대체 SHA를 지원하기위한 이러한 노력이 진행 중입니다. " Git이 왜 최신 SHA를 사용하지 않습니까? "를 참조하십시오.


" git이 blob에서 SHA-1 충돌을 어떻게 처리 할까? "에서 언급 했는데 특정 SHA1 접두사를 사용하여 커밋을 엔지니어링 할 수 있습니다 (여전히 비용이 많이 드는 노력). 그러나 Eric Sink 가 " Git : Cryptographic Hashes "( Version Control by Example (2011)) 책 에서 언급했듯이 요점은 여전히 ​​남아 있습니다 .

DVCS는 동일한 다이제스트가있는 두 개의 서로 다른 데이터 조각을 만나지 않는 것이 중요합니다. 다행스럽게도 좋은 암호화 해시 기능은 이러한 충돌을 극소화시키지 않도록 설계되었습니다.

" 유전자 프로그래밍으로 최첨단 비 암호 해시 찾기 "와 같은 연구를 고려하지 않는 한 낮은 충돌 률로 우수한 비 암호 해시 를 찾기가 더 어렵습니다 .

또한 " 해싱 속도 향상을위한 비 암호 해시 알고리즘 사용 고려 "를 읽을 수 있습니다. 예를 들어 , 매우 빠른 비 암호 해시 알고리즘 인 " xxhash "는 RAM 한계에 가까운 속도로 작동합니다.


Git에서 해시 변경에 대한 토론은 새로운 것이 아닙니다.

(리누스 토발즈)

모질라 코드 에는 실제로 남아있는 것이 없지만 시작했습니다. 돌이켜 보면 필자는 이미 블로킹을 잘못 수행 한 PPC asm 코드에서 시작했을 것입니다.

게다가, 모질라 코드는 무시 무시한 더미 였고, 내가 일을 개선 할 수 있다는 확신을 갖게 된 이유입니다. 따라서 실제 남은 코드보다 동기 부여 측면에 더 가깝더라도 소스의 일종입니다.)

실제 최적화 이득을 측정하는 방법에 주의해야합니다

(리누스 토발즈)

gcc가 쓰레기 코드를 생성하게하여 P4 문제 중 일부를 숨기므로 만 개선한다는 것을 거의 보장 할 수 있습니다.

(존 탭셀- johnflux)

git을 SHA-1에서 새로운 알고리즘으로 업그레이드하는 데 드는 엔지니어링 비용은 훨씬 높습니다 . 어떻게 잘 할 수 있는지 잘 모르겠습니다.

우선 우리는 아마도 git 버전을 배포해야합니다 (이 대화에서는 버전 2라고합시다).이 공간을 읽거나 사용하지 않아도 새로운 해시 값을위한 슬롯이있을 수 있습니다. 다른 슬롯에있는 SHA-1 해시 값

우리가 일단 그런 식으로 결국 아직 자식의 새 버전을 배포가,의는 SHA-1 해시에 추가 SHA-3 해시를 생성 버전 3을 부르 자, 자식 버전 2를 사용하는 사람들은 계속 할 수있을 것입니다 간 작동합니다.
(이 토론에 따르면 취약 할 수 있으며 SHA-1 전용 패치에 의존하는 사람들이 취약 할 수 있습니다.)

즉, 전환 어떤 해시 쉽지 않다.


2017 년 2 월 업데이트 : 예, 충돌하는 SHA1을 계산하는 것이 이론상 가능합니다 : shattered.io

GIT는 어떤 영향을 받습니까?

GIT는 모든 파일 개체 및 커밋의 식별 및 무결성 검사를 위해 SHA-1에 크게 의존합니다.
기본적으로 동일한 헤드 커밋 해시와 서로 다른 내용 (예 : 양성 소스 코드 및 백도어 코드)으로 두 개의 GIT 리포지토리를 생성 할 수 있습니다.
공격자는 잠재적으로 대상 사용자에게 두 저장소 중 하나를 선택적으로 제공 할 수 있습니다. 공격자는 자신의 충돌을 계산해야합니다.

그러나:

이 공격에는 9,223,372,036,854,775,808 SHA1 이상의 계산이 필요했습니다. 이는 6,500 년의 단일 CPU 계산과 110 년의 단일 GPU 계산과 동등한 처리 성능을 갖추 었습니다.

아직 당황하지 마십시오.
" Git은 어떻게 blob에서 SHA-1 충돌을 처리 할까? "를 참조하십시오.


8
xxhash와 같은 고품질 비 암호 해시 함수의 최근 작물은 git 직후에 너무 늦게 나온 것처럼 보입니다.
Praxeolitic

3
실제로 @Praxeolitic. SHA1을 다른 해시로 대체하는 것에 대한 논의가 있었지만 현재로서는 잘 작동하는 데 약간의 작업이 필요합니다.
VonC

"해시가 잘 분산되어 있고 특정 배포 문제에 대해 걱정할 필요가 없습니다"-왜 이것이 scm에 문제가됩니까?
로드

@roded 충돌 속도는 데이터가 일반적으로 무작위가 아니라 테스트 파일 인 SCM에 적합 할 정도로 낮습니다.
VonC

1
실제로, 암호화 해시를 사용하는 보안상의 이유가 있습니다. 저자 (예 : Linus)가 Linux (예 : Linux)의 릴리스를 잘라내려고 할 때 사람들이 다운로드 한 소스 코드가 저자가 릴리스에 포함시키려는 의도와 일치하는지 알고 싶어합니다. 이를 위해 릴리스의 마지막 커밋 해시에 태그가 지정되고 태그가 서명됩니다. 태그로 끝나는 커밋 해시 체인이 암호로 안전하지 않은 경우 소스가 작성자가 의도 한 것 이외의 것으로 얼룩 져있을 수 있습니다.
Christopher King
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.