Mengapa Git menggunakan fungsi hash kriptografi?

140

Mengapa Git menggunakan SHA-1 , fungsi hash kriptografi, daripada fungsi hash non-kriptografi yang lebih cepat?

Pertanyaan terkait:

Pertanyaan Stack Overflow Mengapa Git menggunakan SHA-1 sebagai nomor versi? menanyakan mengapa Git menggunakan SHA-1 sebagai lawan nomor urut untuk komit.

Praxeolitik
sumber
Secara pribadi saya berpikir bahwa bahkan menggunakan SHA-1 yang rusak melalui SHA-2 adalah pengoptimalan yang prematur.
CodesInChaos
7
@CodesInChaos: dan selain itu, memasukkan algoritme tertentu ke dalam kode merupakan pelanggaran mengerikan terhadap prinsip DI. Harus ada dalam file konfigurasi XML di suatu tempat ;-)
Steve Jessop
Perbarui Desember 2017 dengan Git 2.16 (K1 2018): upaya untuk mendukung SHA alternatif sedang dilakukan: lihat " Mengapa Git tidak menggunakan SHA yang lebih modern? ".
VonC
Tidak ada yang baik 160-bit atau hash non-kripto yang lebih tinggi. Sebagian besar adalah fungsi 32-bit, 64-bit atau 128-bit yang sangat dioptimalkan. 128-bit baik-baik saja, tetapi saya merasa 128-bit agak rendah untuk proyek besar seperti git. Jika hash 224/256-bit yang cepat dan berkualitas tinggi keluar, mungkin itu ideal.
bryc

Jawaban:

198

TLDR;


Anda dapat memeriksanya dari Linus Torvalds sendiri, ketika dia mempresentasikan Git ke Google pada tahun 2007 :
(penekanan dari saya)

Kami memeriksa checksum yang dianggap aman secara kriptografis. Tidak ada yang bisa merusak SHA-1, tapi intinya, SHA-1 sejauh menyangkut git, bahkan bukan fitur keamanan. Ini murni pemeriksaan konsistensi .
Bagian keamanan ada di tempat lain. Banyak orang beranggapan karena git menggunakan SHA-1 dan SHA-1 digunakan untuk hal-hal yang aman secara kriptografis, mereka berpikir bahwa ini adalah fitur keamanan yang sangat besar. Ini sama sekali tidak ada hubungannya dengan keamanan, itu hanya hash terbaik yang bisa Anda dapatkan.

Memiliki hash yang baik itu baik untuk dapat mempercayai data Anda , kebetulan memiliki beberapa fitur bagus lainnya juga, itu berarti ketika kita melakukan hash objek, kita tahu hash tersebut terdistribusi dengan baik dan kita tidak perlu khawatir tentang masalah distribusi tertentu .

Secara internal artinya dari sudut pandang implementasi, kita dapat percaya bahwa hash sangat bagus sehingga kita dapat menggunakan algoritma hashing dan mengetahui tidak ada kasus yang buruk.

Jadi, ada beberapa alasan untuk menyukai sisi kriptografik juga, tetapi ini benar-benar tentang kemampuan mempercayai data Anda.
Saya jamin, jika Anda memasukkan data Anda ke dalam git, Anda dapat mempercayai fakta bahwa lima tahun kemudian, setelah diubah dari harddisk Anda ke DVD ke teknologi baru apa pun dan Anda menyalinnya, lima tahun kemudian Anda dapat memverifikasi data Anda. get back out adalah data yang sama persis dengan yang Anda masukkan. Dan itu adalah sesuatu yang harus Anda cari dalam sistem manajemen kode sumber .


Perbarui Desember 2017 dengan Git 2.16 (K1 2018): upaya untuk mendukung SHA alternatif ini sedang berlangsung: lihat " Mengapa Git tidak menggunakan SHA yang lebih modern? ".


Saya menyebutkan dalam " Bagaimana git menangani tabrakan SHA-1 pada blob? " Bahwa Anda dapat merekayasa komitmen dengan awalan SHA1 tertentu (masih merupakan upaya yang sangat mahal).
Tapi intinya tetap, seperti yang disebutkan Eric Sink dalam buku " Git: Cryptographic Hashes " ( Version Control by Example (2011) :

Sangatlah penting bahwa DVCS tidak pernah menemukan dua bagian data berbeda yang memiliki intisari yang sama. Untungnya, fungsi hash kriptografi yang baik dirancang untuk membuat tabrakan seperti itu sangat tidak mungkin.

Lebih sulit untuk menemukan hash non-kriptografik yang bagus dengan tingkat tabrakan yang rendah, kecuali Anda mempertimbangkan penelitian seperti " Menemukan Hash Non-kriptografik yang Canggih dengan Pemrograman Genetik ".

Anda juga dapat membaca " Pertimbangkan penggunaan algoritme hash non-kriptografik untuk percepatan hashing ", yang menyebutkan misalnya " xxhash ", algoritme Hash non-kriptografik yang sangat cepat, bekerja pada kecepatan yang mendekati batas RAM.


Diskusi seputar mengubah hash di Git bukanlah hal baru:

(Linus Torvalds)

Sebenarnya tidak ada yang tersisa dari kode mozilla, tapi hei, saya mulai dari itu. Dalam retrospeksi saya mungkin harus mulai dari kode asm PPC yang sudah melakukan pemblokiran secara wajar - tapi itu adalah semacam "20/20 tinjauan ke belakang".

Plus, hei, kode mozilla menjadi tumpukan minyak mentah yang mengerikan adalah mengapa saya begitu yakin bahwa saya bisa memperbaiki banyak hal. Jadi itu semacam sumber untuk itu, meskipun itu lebih tentang sisi motivasi daripada kode yang tersisa;)

Dan Anda harus berhati-hati tentang cara mengukur perolehan pengoptimalan yang sebenarnya

(Linus Torvalds)

Saya cukup banyak dapat menjamin Anda bahwa itu meningkatkan banyak hal hanya karena itu membuat gcc menghasilkan kode sampah, yang kemudian menyembunyikan beberapa masalah P4.

(John Tapsell - johnflux)

Biaya teknik untuk mengupgrade git dari SHA-1 ke algoritme baru jauh lebih tinggi . Saya tidak yakin bagaimana itu bisa dilakukan dengan baik.

Pertama-tama kita mungkin perlu menerapkan versi git (sebut saja versi 2 untuk percakapan ini) yang memungkinkan ada slot untuk nilai hash baru meskipun tidak membaca atau menggunakan ruang itu - hanya menggunakan nilai hash SHA-1 yang ada di slot lainnya.

Dengan begitu, setelah kami akhirnya menerapkan versi git yang lebih baru, sebut saja versi 3, yang menghasilkan hash SHA-3 selain hash SHA-1, orang yang menggunakan git versi 2 akan dapat terus beroperasi.
(Meskipun, berdasarkan diskusi ini, mereka mungkin rentan dan orang yang mengandalkan patch khusus SHA-1 mereka mungkin rentan.)

Singkatnya, beralih ke hash apa pun tidaklah mudah.


Perbarui Februari 2017: ya, secara teori mungkin untuk menghitung SHA1 yang bertabrakan: shattered.io

Bagaimana GIT terpengaruh?

GIT sangat bergantung pada SHA-1 untuk identifikasi dan pemeriksaan integritas semua objek dan komit file.
Pada dasarnya adalah mungkin untuk membuat dua repositori GIT dengan hash komit kepala yang sama dan konten yang berbeda, katakanlah kode sumber jinak dan yang backdoor.
Penyerang berpotensi menyajikan repositori secara selektif kepada pengguna yang ditargetkan. Ini akan membutuhkan penyerang untuk menghitung tabrakan mereka sendiri.

Tapi:

Serangan ini membutuhkan lebih dari 9.223.372.036.854.775.808 perhitungan SHA1. Ini membutuhkan daya pemrosesan yang setara dengan 6.500 tahun komputasi CPU tunggal dan 110 tahun komputasi GPU tunggal.

Jadi jangan panik dulu.
Lihat lebih lanjut di " Bagaimana Git menangani tabrakan SHA-1 pada blob? ".

VonC
sumber
8
Sepertinya hasil terbaru dari fungsi hash non-kriptografi berkualitas tinggi, seperti xxhash, keluar sedikit terlambat - tepat setelah git.
Praxeolitik
3
@Pramugari_id. Ada diskusi tentang mengganti SHA1 dengan hash lain, tetapi itu hanya membutuhkan sedikit kerja, untuk sesuatu yang, untuk saat ini, berfungsi dengan baik.
VonC
"kami tahu hash didistribusikan dengan baik dan kami tidak perlu khawatir tentang masalah distribusi tertentu" - mengapa ini menjadi masalah untuk scm?
dicabut
@roded tingkat tabrakan cukup rendah untuk disesuaikan dengan SCM di mana datanya umumnya tidak acak tetapi file uji.
VonC
1
Sebenarnya, ada alasan keamanan untuk menggunakan hash kriptografi. Ketika seorang penulis (katakanlah Linus) ingin memotong rilis (katakanlah Linux) orang-orang ingin mengetahui kode sumber yang mereka unduh cocok dengan apa yang ingin dimasukkan oleh penulis dalam rilis. Untuk tujuan ini hash komit terakhir dalam rilis diberi tag dan tag ditandatangani. Jika rantai hash komit yang diakhiri dengan tag tidak aman secara kriptografik maka sumbernya dapat tercoreng ke sesuatu selain yang dimaksudkan oleh pembuatnya.
Christopher King