Kapan CRC lebih tepat digunakan daripada MD5 / SHA1?

130

Kapan tepat menggunakan CRC untuk deteksi kesalahan versus fungsi hashing yang lebih modern seperti MD5 atau SHA1? Apakah yang pertama lebih mudah diimplementasikan pada perangkat yang tertanam?

Gili
sumber

Jawaban:

114

CRC berfungsi dengan baik untuk mendeteksi kesalahan acak pada data yang mungkin terjadi, misalnya, dari gangguan jaringan, gangguan saluran, distorsi, dll.

CRC secara komputasional jauh lebih kompleks daripada MD5 atau SHA1. Menggunakan fungsi hash seperti MD5 mungkin berlebihan untuk deteksi kesalahan acak. Namun, menggunakan CRC untuk segala jenis pemeriksaan keamanan akan jauh lebih tidak aman daripada fungsi hashing yang lebih kompleks seperti MD5.

Dan ya, CRC jauh lebih mudah diimplementasikan pada perangkat keras tertanam, Anda bahkan bisa mendapatkan solusi paket yang berbeda untuk ini di IC.

mendefinisikan
sumber
1
@ gili: Anda selalu dapat xor bersama-sama untuk mendapatkan satu kata yang dihasilkan.
Blindy
2
@ Durin: Anda sepenuhnya benar dalam jawaban Anda, tetapi mungkin mempertimbangkan mengubah "CRC secara komputasi jauh lebih efisien" menjadi "CRC secara komputasi jauh lebih mudah"? Algoritma MD5 / SHA-1 adalah kompleks, tetapi tidak benar-benar 'tidak efisien' IMO.
Coxy
1
@coxymla Anda benar, kata yang seharusnya saya gunakan adalah "kompleks" bukan "tidak efisien". Terima kasih!
mendefinisikan
27
Untuk mengurangi hash panjang menjadi 32 bit, ambil 32 bit pertama.
orip
1
Jika keamanan adalah tujuan Anda maka Anda tidak boleh pernah menggunakan MD5, SHA-1juga harus dihindari, beberapa varian SHA-2direkomendasikan.
Peter
33

CRC dirancang terhadap perubahan yang tidak disengaja dalam data. Artinya, itu baik untuk mendeteksi kesalahan yang tidak disengaja, tetapi akan sia-sia sebagai cara untuk memastikan data tidak ditangani dengan jahat.

Lihat juga ini .

Liran Orevi
sumber
Bagian terpenting dari tautan dalam jawaban ini: "(...) bahkan CRC 2048-bit akan secara kriptografis jauh lebih tidak aman daripada MD5 128-bit"
Marc.2377
3
Meskipun jawabannya masih benar, MD5 dan SHA1 berada pada tingkat keamanan yang sama saat ini. Dengan kata lain, hanya baik untuk mendeteksi kesalahan yang tidak disengaja.
Piskvor meninggalkan gedung
21

Saya menemukan sebuah penelitian yang menunjukkan betapa tidak pantasnya hash CRC untuk tabel hash . Ini juga menjelaskan karakteristik sebenarnya dari algoritma. Studi ini juga mencakup evaluasi algoritma hash lainnya dan merupakan referensi yang baik untuk disimpan.

Kesimpulan yang relevan tentang CRC untuk hash:

CRC32 tidak pernah dimaksudkan untuk penggunaan tabel hash. Sebenarnya tidak ada alasan yang baik untuk menggunakannya untuk tujuan ini, dan saya sarankan Anda menghindari melakukannya. Jika Anda memutuskan untuk menggunakan CRC32, sangat penting bahwa Anda menggunakan bit hash dari ujung yang berlawanan dengan yang di mana oktet kunci dimasukkan. Yang ujung ini tergantung pada implementasi CRC32 spesifik. Jangan memperlakukan CRC32 sebagai fungsi hash "kotak hitam", dan jangan menggunakannya sebagai hash tujuan umum. Pastikan untuk menguji setiap aplikasi untuk kesesuaian.

MEMPERBARUI

Sepertinya situs ini sedang down. The arsip internet memiliki salinan sekalipun.

Andre Luus
sumber
Tautan rusak. Mungkin Anda bisa menulis penjelasannya sendiri? Jika tidak jawabannya tidak berguna.
ceving
Oke, saya akan memasukkan kesimpulan dalam jawaban saya.
Andre Luus
Aneh, menurut patokan di sini , CRC sebenarnya melakukan cukup baik dalam hal kecepatan dan jumlah tabrakan.
ostrokach
Sangat menarik. Saya harus melihat studi yang saya tautkan lagi, tetapi jika saya harus menebak itu pasti karena implementasi pengujian yang berbeda. Jika saya harus membuat keputusan, saya akan meminta saran dari penelitian, tampaknya lebih masuk akal secara ilmiah.
Andre Luus
Dalam pengalaman saya membuat jutaan URL, CRC64 bertabrakan 8 kali dan MD5 bertabrakan 5. Jelas MD5 lebih baik, tetapi CRC64 adalah hash yang hebat dan lebih cepat dan lebih sederhana.
J. Dimeo
18

Saya menjalankan setiap baris kode PHP ini dalam 1.000.000 loop. Hasilnya ada di komentar (#).

hash('crc32', 'The quick brown fox jumped over the lazy dog.');#  750ms   8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');#  700ms   8 chars
hash('md5',   'The quick brown fox jumped over the lazy dog.');#  770ms  32 chars
hash('sha1',  'The quick brown fox jumped over the lazy dog.');#  880ms  40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms  64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms  96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars

Kesimpulan saya:

  • Gunakan "crc32b" ketika Anda membutuhkan http://en.wikipedia.org/wiki/Cyclic_redundancy_check dan Anda tidak peduli dengan keamanan.
  • Gunakan "sha256" (atau lebih tinggi) saat Anda membutuhkan lapisan keamanan tambahan.

  • Jangan gunakan "md5" atau "sha1" karena mereka memiliki:

    1. beberapa masalah keamanan saat Anda peduli dengan keamanan
    2. string hash lebih panjang dan lebih lambat dari "crc32b" ketika semua yang Anda butuhkan adalah CRC
Martin
sumber
maksud Anda bit, bukan chars
esskar
Tidak juga. gema hash ('crc32', 'Rubah cokelat cepat melompati anjing yang malas.'); gema "413a86af", string panjang 8 karakter. Btw, ini adalah nomor 32 bit yang disimpan dalam format HEX. Sebagai contoh, "sha256" memiliki hash 256bit, sekali lagi disimpan sebagai HEX, yang memberikan string panjang 64 karakter.
Martin
45
Hasil ini sangat menipu. Ketika algoritma hashing ini diterapkan untuk satu set data yang besar ( Perang dan Damai bukan "The quick brown fox jumped over the lazy dog.") Anda akan melihat berapa banyak cepat CRC adalah dari MD5.
ubiquibacon
1
Ada kasus menengah (duplikat memeriksa di perpustakaan) di mana MD5 / Sha1 adalah solusi yang tepat: mereka tidak perlu menangani kasus di mana ada musuh yang dengan hati-hati membuat tabrakan hash yang semakin menghilang, tetapi mereka perlu menangani tabrakan tak disengaja. Jadi: Mendeteksi kesalahan bit dan korupsi: CRC32 Mendeteksi tabrakan di perpustakaan: MD5 / SHA1 Aplikasi permusuhan: Sha256 dan lebih tinggi. Tentu saja, jika Anda memiliki perpustakaan dengan miliaran entri, maka Anda mungkin perlu menambah bit hash Anda juga.
Dewi Morgan
PHP? pada platform ARM, kode tertanam, 16MHz sebuah CRC32 dari 46 byte, mungkin 12 mikrodetik. Itu memiliki bantuan perangkat keras. Bahkan perangkat keras yang dibantu AES akan beberapa ratus kali lebih lambat. Tabel pencarian tanpa bantuan CRC masih harus datang di sekitar 50 mikrodetik.
ilgitano
9

Itu semua tergantung pada kebutuhan dan harapan Anda.

Berikut ini perbedaan singkat cepat antara algoritme fungsi hash ini :

CRC (CRC-8/16/32/64)

  • adalah tidak algoritma hashing kriptografi (itu menggunakan fungsi linear berdasarkan CRC)
  • dapat menghasilkan 9, 17, 33 atau 65 bit
  • tidak dimaksudkan untuk digunakan untuk tujuan kriptografi karena tidak ada jaminan kriptografi,
  • tidak cocok untuk digunakan dalam tanda tangan digital, karena mudah dibalik 2006 ,
  • tidak boleh digunakan untuk keperluan enkripsi,
  • string yang berbeda dapat menghasilkan tumbukan,
  • diciptakan pada tahun 1961 dan digunakan dalam Ethernet dan banyak standar lainnya,

MD5

SHA-1

  • adalah algoritma hash kriptografi,

  • menghasilkan nilai hash 160-bit (20-byte) yang dikenal sebagai intisari pesan

  • itu adalah hash kriptografi dan sejak 2005 itu tidak lagi dianggap aman,

  • dapat digunakan untuk keperluan enkripsi,

  • contoh tabrakan sha1 telah ditemukan

  • pertama kali diterbitkan pada tahun 1993 (sebagai SHA-0), kemudian 1995 sebagai SHA-1,

  • seri: SHA-0, SHA-1, SHA-2, SHA-3,

    Singkatnya, menggunakan SHA-1 tidak lagi dianggap aman terhadap lawan yang didanai dengan baik, karena pada 2005, cryptanalyst menemukan serangan pada SHA-1 yang menunjukkan kemungkinan tidak cukup aman untuk schneier penggunaan yang sedang berlangsung . US NIST menyarankan bahwa agen-agen federal harus berhenti menggunakan SHA1-1 untuk aplikasi yang memerlukan resistensi tabrakan dan harus menggunakan SHA-2 setelah 2010 NIST .

Oleh karena itu, jika Anda mencari solusi sederhana dan cepat untuk memeriksa integritas file (terhadap korupsi), atau untuk beberapa tujuan cache sederhana dalam hal kinerja, Anda dapat mempertimbangkan CRC-32, untuk hashing Anda dapat mempertimbangkan untuk menggunakan MD5, namun jika Anda mengembangkan aplikasi profesional (yang harus aman dan konsisten), untuk menghindari kemungkinan tabrakan - gunakan SHA-2 dan yang lebih tinggi (seperti SHA-3).

Performa

Beberapa tes benchmark sederhana dalam PHP:

# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s

Terkait:

kenorb
sumber
8

Anda tidak mengatakan apa yang ingin Anda lindungi.

CRC sering digunakan dalam sistem tertanam sebagai pemeriksaan terhadap korupsi data yang tidak disengaja sebagai lawan mencegah modifikasi sistem berbahaya. Contoh tempat di mana CRC dapat berguna adalah untuk memvalidasi gambar EPROM selama inisialisasi sistem untuk menjaga terhadap kerusakan firmware. Bootloader sistem akan menghitung CRC untuk kode aplikasi dan membandingkannya dengan nilai yang disimpan sebelum mengizinkan kode dijalankan. Ini melindungi terhadap kemungkinan korupsi program yang tidak disengaja atau unduhan yang gagal.

CRC juga dapat digunakan dengan cara yang sama untuk melindungi data konfigurasi yang disimpan dalam FLASH atau EEPROM. Jika CRC tidak benar maka data dapat ditandai sebagai tidak valid dan set data cadangan default atau yang digunakan. CRC mungkin tidak valid karena kegagalan perangkat atau jika pengguna melepaskan daya selama pembaruan penyimpanan data konfigurasi.

Ada komentar bahwa hash memberikan kemungkinan lebih besar untuk mendeteksi korupsi daripada CRC dengan banyak kesalahan bit. Ini benar, dan keputusan apakah menggunakan CRC 16 atau 32 bit atau tidak akan bergantung pada konsekuensi keamanan dari blok data yang rusak yang digunakan dan apakah Anda dapat membenarkan peluang 1 in 2 ^ 16 atau 2 ^ 32 dari blok data yang dinyatakan salah valid.

Banyak perangkat memiliki generator CRC bawaan untuk algoritma standar. Seri MSP430F5X dari Texas memiliki implementasi perangkat keras dari Standar CRC-CCITT.

kamu
sumber
6

CRC32 lebih cepat dan hash hanya 32 bit.

Gunakan saat Anda hanya menginginkan checksum yang cepat dan ringan. CRC digunakan dalam ethernet.

Jika Anda membutuhkan lebih banyak keandalan, lebih baik menggunakan fungsi hashing modern.

François
sumber
5

Hanya gunakan CRC jika sumber daya komputasi sangat ketat (yaitu beberapa lingkungan sematan) atau Anda perlu menyimpan / mengangkut banyak nilai output dan ruang / bandwidth ketat (karena CRC biasanya 32-bit di mana output MD5 128-bit, SHA1 160 bit, dan varian SHA lainnya hingga 512 bit).

Jangan pernah menggunakan CRC untuk pemeriksaan keamanan karena CRC sangat mudah untuk "dipalsukan".

Bahkan untuk deteksi kesalahan yang tidak disengaja (daripada deteksi perubahan berbahaya) hash lebih baik daripada CRC sederhana. Sebagian karena cara sederhana CRC dihitung (dan sebagian karena nilai CRC biasanya lebih pendek dari output hash umum sehingga memiliki rentang nilai yang jauh lebih kecil), itu jauh lebih mungkin bahwa, dalam situasi di mana ada dua atau lebih kesalahan , satu kesalahan akan menutupi yang lain sehingga Anda berakhir dengan CRC yang sama meskipun ada dua kesalahan.

Singkatnya: kecuali Anda memiliki alasan untuk tidak menggunakan algoritma hash yang layak, hindari CRC sederhana.

David Spillett
sumber
1
CRC akan menangkap semua perubahan data yang tidak disengaja jika Anda menggunakan polinomial yang tepat. 1/2 ^ 32 perubahan tidak terjawab jika beberapa bit tepat diubah.
Gerhard
Dan dengan polinomial yang tepat, ia juga akan menangkap semua kesalahan dari kelas umum tertentu, misalnya kesalahan burst.
erikkallen
Saya setuju dengan jawaban Anda kecuali pertanyaannya adalah tentang sistem tertanam. Kinerja algoritma kriptografi dapat menjadi masalah pada sistem embedded yang lebih kecil.
Craig McQueen
Akan sangat tidak setuju dengan itu. Polinomial kesalahan CRC dipilih dengan cermat sehingga mereka dapat mendeteksi 1,2,3,5 dan memecahkan kesalahan hingga 11 bit dalam beberapa kasus. Hash kriptografis murni bersifat statistik, jadi Anda harus menggunakan nilai intisari yang besar. 8-32 bit tidak realistis untuk intisari hash kriptografis serta mahalnya cpu cy dan gerbang. Jelas bukan jawaban untuk diterima jika Anda bekerja pada sistem embedded. Satu-satunya waktu untuk TIDAK menggunakan CRC adalah jika Anda harus berurusan dengan skenario musuh yang cerdas.
ilgitano
5

Saya menemukan penggunaan CRC baru-baru ini yang cerdas. Penulis alat identifikasi duplikasi dan penghapusan file jdupe (penulis yang sama dari alat exif jhead yang populer) menggunakannya selama melewati pertama file. CRC dihitung pada 32K pertama dari setiap file untuk menandai file yang tampak sama, juga file harus memiliki ukuran yang sama. File-file ini ditambahkan ke daftar file untuk melakukan perbandingan biner penuh. Ini mempercepat memeriksa file media besar.

John Wright
sumber
Salah satu masalah dengan pendekatan itu adalah ketika dijalankan pada file yang berisi CRC32 enbedded di dalamnya, CRC yang dihasilkan mungkin independen dari data dalam file (karena jika data berubah, CRC32 akan diubah sehingga dapat membatalkan perbedaan ). Membungkam data dengan cara sederhana sebelum menghitung CRC32 akan menghindari masalah itu.
supercat
1
@ supercat - Saya benar-benar tidak percaya bahwa ini sebenarnya masalah. Jika file berisi header crc32 yang merupakan crc32 dari sisa file, maka ketika file diperbarui setiap bit di header crc32 akan memiliki sekitar 50% kemungkinan menjadi berbeda. Perubahan pada header harus mengikuti distribusi yang cukup acak. Saya gagal melihat bagaimana ini akan menghasilkan CRC32 (header + data) selalu sama, atau dengan cara apa pun tidak bergantung pada bagian data file.
teratorn
@teratorn: Saya telah melihat sejumlah file yang memiliki CRC32 di akhir, dihitung sedemikian rupa sehingga CRC32 dari seluruh file, dihitung dengan menggunakan beberapa konstanta seed tertentu, akan selalu menjadi beberapa nilai konstan lainnya. Ini sangat umum dengan hal-hal seperti gambar kode biner. Jika Acme 1000 DVD player menggunakan gambar kode ukuran tetap untuk peningkatan firmware, dan mengharapkan setiap gambar kode memiliki CRC32 tertentu, maka rutin yang menghitung CRC32 dari berbagai file tidak akan dapat membedakan gambar kode yang berbeda untuk Acme 1000.
supercat
Poin CRC dalam hal ini adalah untuk dengan cepat mengidentifikasi bahwa file berbeda. Jika CRC kembali sama, Anda sekarang harus melakukan perbandingan biner yang mahal, sehingga CRC yang disematkan tidak merusak algoritma. Bisa terjadi bahwa beberapa file akhirnya menjadi biner dibandingkan karena CRC pass pertama mengatakan mereka mungkin sama, tetapi tidak mungkin banyak dari mereka, dan Anda dapat menghindarinya dengan menggunakan polinomial khusus.
ilgitano
4

CRC32 jauh lebih cepat dan kadang-kadang memiliki dukungan perangkat keras (yaitu pada prosesor Nehalem). Sungguh, satu-satunya waktu Anda akan menggunakannya adalah jika Anda berinteraksi dengan perangkat keras, atau jika Anda benar - benar ketat dalam kinerja

Ana Betts
sumber
4

Mari kita mulai dengan dasar-dasarnya.

Dalam Kriptografi, algoritma hashing mengubah banyak bit menjadi lebih sedikit melalui operasi digest. Hash digunakan untuk mengonfirmasi integritas pesan dan file.

Semua algoritma hashing menghasilkan collision. Tabrakan adalah ketika beberapa kombinasi banyak bit menghasilkan keluaran bit yang sama lebih sedikit. Kekuatan kriptografi dari algoritma hashing ditentukan oleh ketidakmampuan bagi seorang individu untuk menentukan apa output yang akan diberikan untuk input yang diberikan karena jika mereka dapat, mereka dapat membuat file dengan hash yang cocok dengan file yang sah dan kompromi dengan asumsi integritas dari sistem. Perbedaan antara CRC32 dan MD5 adalah bahwa MD5 menghasilkan hash yang lebih besar yang sulit diprediksi.

Saat Anda ingin menerapkan integritas pesan - artinya pesan belum diubah saat transit - ketidakmampuan untuk memprediksi tabrakan adalah properti yang penting. Sebuah 32-bit hash bisa menggambarkan 4 miliar pesan yang berbeda atau file menggunakan 4 miliar hash unik yang berbeda. Jika Anda memiliki 4 miliar dan 1 file, Anda dijamin memiliki 1 tabrakan. 1 TB Bitspace memiliki kemungkinan untuk Miliaran Tabrakan. Jika saya seorang penyerang dan saya bisa memprediksi hash 32 bit itu nantinya, saya bisa membuat file yang terinfeksi yang bertabrakan dengan file target; yang memiliki hash yang sama.

Selain itu jika saya melakukan transmisi 10mbps maka kemungkinan sebuah paket rusak tepat untuk memotong CRC32 dan melanjutkan sepanjang ke tujuan dan mengeksekusi sangat rendah. Katakanlah pada 10mbps saya mendapatkan 10 kesalahan \ detik . Jika saya meningkatkannya hingga 1gbps, sekarang saya mendapatkan 1.000 kesalahan per detik . Jika saya ram hingga 1 exabit per detik, maka saya memiliki tingkat kesalahan 1.000.000.000 kesalahan per detik . Katakanlah kita memiliki tingkat tabrakan 1 \ 1.000.000kesalahan transmisi, Artinya 1 dalam sejuta kesalahan transmisi menghasilkan data yang korup tidak terdeteksi. Pada 10mbps saya akan mendapatkan data kesalahan yang dikirim setiap 100.000 detik atau sekali sehari. Pada 1gbps itu akan terjadi setiap 5 menit sekali. Pada 1 exabit per detik, kita berbicara beberapa kali per detik.

Jika Anda membuka Wireshark Anda akan melihat header Ethernet khas Anda memiliki CRC32, header IP Anda memiliki CRC32, dan Header TCP Anda memiliki CRC32, dan itu merupakan tambahan terhadap apa yang mungkin dilakukan oleh protokol layer yang lebih tinggi; misalnya IPSEC mungkin menggunakan MD5 atau SHA untuk memeriksa integritas selain yang di atas. Ada beberapa lapisan pengecekan error dalam komunikasi jaringan tipikal, dan mereka MASIH sering dan sesekali pada kecepatan sub 10mbps.

Cyclic Redundancy Check (CRC) memiliki beberapa versi umum dan beberapa tidak umum tetapi umumnya dirancang untuk hanya memberitahu ketika pesan atau file telah rusak dalam perjalanan (beberapa bit membalik). CRC32 dengan sendirinya bukan protokol pemeriksaan kesalahan yang sangat baik menurut standar saat ini di lingkungan perusahaan skalar yang besar karena tingkat tabrakan; rata-rata pengguna hard-drive dapat memiliki lebih dari 100 ribu file, dan berbagi file di sebuah perusahaan dapat memiliki puluhan juta. Rasio ruang-hash dengan jumlah file terlalu rendah. CRC32 secara komputasi murah untuk diimplementasikan sedangkan MD5 tidak.

MD5 dirancang untuk menghentikan penggunaan tabrakan yang disengaja untuk membuat file berbahaya terlihat jinak. Itu dianggap tidak aman karena hashspace telah cukup dipetakan untuk memungkinkan beberapa serangan terjadi, dan beberapa tabrakan dapat diprediksi. SHA1 dan SHA2 adalah anak-anak baru di blok.

Untuk verifikasi file, Md5 mulai digunakan oleh banyak vendor karena Anda dapat melakukan file multigigabyte atau file multiterrabyte dengan cepat dan menumpuknya di atas penggunaan OS umum dan dukungan CRC32's. Jangan kaget jika dalam dekade berikutnya sistem file mulai menggunakan MD5 untuk memeriksa kesalahan.

bobinator
sumber
1

Kode CRC lebih sederhana dan lebih cepat.

Untuk apa Anda butuh?

Makarse
sumber