Dlaczego Git używa kryptograficznej funkcji skrótu?

139

Dlaczego Git używa SHA-1 , kryptograficznej funkcji skrótu, zamiast szybszej niekryptograficznej funkcji skrótu?

Powiązane pytanie:

Pytanie o przepełnienie stosu Dlaczego Git używa SHA-1 jako numerów wersji? pyta, dlaczego Git używa SHA-1 w przeciwieństwie do kolejnych liczb dla zatwierdzeń.

Prakseolityczny
źródło
Osobiście uważam, że nawet użycie zepsutego SHA-1 zamiast SHA-2 było przedwczesną optymalizacją.
CodesInChaos
7
@CodesInChaos: a poza tym wrzucenie dowolnego konkretnego algorytmu do kodu było okropnym naruszeniem zasad DI. Powinien być gdzieś w pliku konfiguracyjnym XML ;-)
Steve Jessop
Aktualizacja z grudnia 2017 r. Za pomocą Git 2.16 (I kw. 2018 r.): Trwają prace nad obsługą alternatywnego SHA: zobacz „ Dlaczego Git nie używa nowocześniejszego SHA? ”.
VonC,
Nie ma dobrych 160-bitowych lub wyższych haszów innych niż kryptograficzne. Większość z nich to wysoce zoptymalizowane funkcje 32-bitowe, 64-bitowe lub 128-bitowe. 128-bitowe jest w porządku, ale mam wrażenie, że 128-bitowe to trochę za mało jak na duży projekt, taki jak git. Gdyby pojawił się szybki, wysokiej jakości 224/256-bitowy hash, prawdopodobnie byłby idealny.
bryc

Odpowiedzi:

197

TLDR;


Możesz to sprawdzić od samego Linusa Torvaldsa, gdy przedstawiał Gita Google w 2007 roku :
(moje wyróżnienie)

Sprawdzamy sumy kontrolne uważane za bezpieczne pod względem kryptograficznym. Nikt nie był w stanie złamać SHA-1, ale chodzi o to, że SHA-1, jeśli chodzi o git, nie jest nawet funkcją bezpieczeństwa. To czysta kontrola spójności .
Części zabezpieczające są gdzie indziej. Wiele osób zakłada, że ​​skoro git używa SHA-1, a SHA-1 jest używany do kryptograficznie zabezpieczonych rzeczy, myślą, że jest to ogromna funkcja bezpieczeństwa. Nie ma to nic wspólnego z bezpieczeństwem, to tylko najlepszy hash, jaki możesz zdobyć.

Posiadanie dobrego skrótu jest dobre, aby móc zaufać swoim danym , zdarza się, że ma też inne dobre funkcje, co oznacza, że ​​kiedy haszujemy obiekty, wiemy, że hash jest dobrze rozproszony i nie musimy się martwić o pewne problemy z dystrybucją .

Wewnętrznie oznacza to z punktu widzenia implementacji, że możemy ufać, że hasz jest tak dobry, że możemy używać algorytmów haszujących i wiedzieć, że nie ma złych przypadków.

Jest więc kilka powodów, dla których warto lubić stronę kryptograficzną, ale tak naprawdę chodzi o możliwość zaufania swoim danym.
Gwarantuję Ci, że jeśli umieścisz swoje dane w git, możesz zaufać temu, że pięć lat później, po przekonwertowaniu z dysku twardego na DVD na jakąkolwiek nową technologię i skopiowaniu go razem, pięć lat później możesz zweryfikować dane powrót to dokładnie te same dane, które wprowadziłeś. I jest to coś, czego naprawdę powinieneś szukać w systemie zarządzania kodem źródłowym .


Aktualizacja z grudnia 2017 r. Za pomocą Git 2.16 (I kw. 2018 r.): Trwają prace nad obsługą alternatywnego SHA: zobacz „ Dlaczego Git nie używa nowocześniejszego SHA? ”.


Wspomniałem w „ Jak git poradzi sobie z kolizją SHA-1 na obiekcie blob? ”, Że można zaprojektować zatwierdzenie z określonym prefiksem SHA1 (wciąż jest to niezwykle kosztowne przedsięwzięcie).
Ale sprawa pozostaje, jak wspomina Eric Sink w książceGit: Cryptographic Hashes ” ( Kontrola wersji według przykładu (2011) :

Jest raczej ważne, aby DVCS nigdy nie napotkało dwóch różnych fragmentów danych, które mają ten sam skrót. Na szczęście dobre kryptograficzne funkcje skrótu są zaprojektowane tak, aby takie kolizje były niezwykle mało prawdopodobne.

Trudniej jest znaleźć dobry niekryptograficzny hash z niskim współczynnikiem kolizji, chyba że weźmiesz pod uwagę badania typu „ Znajdowanie najnowocześniejszych niekryptograficznych skrótów za pomocą programowania genetycznego ”.

Możesz również przeczytać artykuł „ Rozważ użycie niekryptograficznego algorytmu mieszającego w celu przyspieszenia mieszania ”, w którym wspomniano na przykład „ xxhash ”, niezwykle szybki niekryptograficzny algorytm Hash, działający z prędkością bliską limitom pamięci RAM.


Dyskusje na temat zmiany hasha w Git nie są nowe:

(Linus Torvalds)

Z kodu Mozilli nie pozostało nic , ale hej, zacząłem od tego. Z perspektywy czasu prawdopodobnie powinienem zacząć od kodu ASM PPC, który już przeprowadził blokowanie rozsądnie - ale to jest coś w rodzaju „20/20”.

Poza tym, hej, kod Mozilli będący okropnym stosem brudu, był powodem, dla którego byłem tak przekonany, że mogę coś poprawić. Więc to jest swego rodzaju źródło, nawet jeśli chodzi bardziej o stronę motywacyjną niż jakikolwiek pozostały kod;)

Musisz też uważać, jak mierzyć rzeczywisty zysk optymalizacji

(Linus Torvalds)

Prawie mogę zagwarantować, że ulepsza to tylko dlatego, że sprawia, że ​​gcc generuje badziewny kod, który następnie ukrywa niektóre problemy z P4.

(John Tapsell - johnflux)

Koszt inżynierii uaktualnienia git z SHA-1 do nowego algorytmu jest znacznie wyższy . Nie jestem pewien, jak można to zrobić dobrze.

Przede wszystkim prawdopodobnie musimy wdrożyć wersję git (nazwijmy ją wersją 2 dla tej konwersacji), która pozwala na umieszczenie miejsca na nową wartość skrótu, nawet jeśli nie czyta ani nie używa tego miejsca - po prostu używa wartość skrótu SHA-1, która znajduje się w drugim gnieździe.

W ten sposób, gdy w końcu wdrożymy jeszcze nowszą wersję git, nazwijmy ją wersją 3, która oprócz skrótów SHA-1 produkuje skróty SHA-3, osoby używające git w wersji 2 będą mogły nadal współdziałać.
(Chociaż zgodnie z tą dyskusją mogą być podatne na ataki, a osoby, które polegają na ich łatkach tylko z SHA-1, mogą być podatne na ataki).

Krótko mówiąc, przejście na dowolny skrót nie jest łatwe.


Aktualizacja luty 2017: tak, teoretycznie możliwe jest obliczenie kolidującego SHA1: shattered.io

Jaki to ma wpływ na GIT?

GIT silnie opiera się na SHA-1 do identyfikacji i sprawdzania integralności wszystkich obiektów plików i zatwierdzeń.
Zasadniczo możliwe jest utworzenie dwóch repozytoriów GIT z tą samą wartością skrótu head commit i różną zawartością, powiedzmy łagodnym kodem źródłowym i wstecznym.
Osoba atakująca może potencjalnie selektywnie udostępniać dowolne repozytorium docelowym użytkownikom. Będzie to wymagało od atakujących obliczenia własnej kolizji.

Ale:

Ten atak wymagał ponad 9.223.372.036.854.775.808 obliczeń SHA1. Wymagało to równoważnej mocy obliczeniowej 6500 lat dla obliczeń z jednym procesorem i 110 lat dla obliczeń z jednym procesorem GPU.

Więc nie panikujmy jeszcze.
Więcej informacji znajdziesz w artykule „ Jak Git poradziłby sobie z kolizją SHA-1 na obiekcie blob? ”.

VonC
źródło
8
Wygląda na to, że niedawny zbiór wysokiej jakości niekryptograficznych funkcji skrótu, takich jak xxhash, pojawił się trochę za późno - zaraz po git.
Praxeolitic
3
@Praxeolitic rzeczywiście. Odbyła się dyskusja na temat zastąpienia SHA1 innym hashem, ale wymagałoby to po prostu sporo pracy, jak na coś, co na razie działa dobrze.
VonC
„wiemy, że hash jest dobrze dystrybuowany i nie musimy się martwić o pewne problemy z dystrybucją” - dlaczego jest to problem dotyczący scm?
wygrał
@roded współczynnik kolizji jest wystarczająco niski, aby dobrze pasował do SCM, w którym dane zazwyczaj nie są losowe, ale pliki testowe.
VonC
1
W rzeczywistości istnieje powód bezpieczeństwa do korzystania z kryptograficznego skrótu. Kiedy autor (powiedzmy Linus) chce wyciąć wydanie (powiedzmy Linux), ludzie chcą wiedzieć, że kod źródłowy, który pobierają, pasuje do tego, co autor zamierzał zamieścić w wydaniu. W tym celu ostatni hash zatwierdzenia w wydaniu jest oznaczany, a tag jest podpisywany. Jeśli łańcuch skrótu zatwierdzenia kończący się w tagu nie byłby zabezpieczony kryptograficznie, wówczas źródło mogłoby zostać zamazane na coś innego niż zamierzony przez autora.
Christopher King,