Kode Hash dan Checksum - apa bedanya?

115

Pemahaman saya adalah bahwa kode hash dan checksum adalah hal yang serupa - nilai numerik, dihitung untuk satu blok data, yang relatif unik.

yaitu Probabilitas dua blok data yang menghasilkan nilai hash / checksum numerik yang sama cukup rendah sehingga dapat diabaikan untuk keperluan aplikasi.

Jadi, apakah kita memiliki dua kata untuk hal yang sama, atau adakah perbedaan penting antara kode hash dan checksum?

Richard Ev
sumber
3
Untuk meringkas jawaban di bawah ini: Kode hash mengurangi masukan menjadi sejumlah kecil, dengan cara yang meminimalkan kemungkinan tabrakan. Sebuah checksum, di sisi lain, mengurangi input menjadi sejumlah kecil, dengan cara yang meminimalkan kemungkinan tabrakan. Anda dapat membuat satu suara berbeda dari yang lain dengan menyusun ulang deskripsi tersebut secara acak.
Dan Stahlke
3
@DanStahlke - Tidak, bukan itu yang dikatakan oleh jawaban di bawah. Ya, keduanya mengurangi masukan menjadi angka yang lebih kecil. Tetapi ada banyak sekali cara untuk melakukannya, bagaimana memilih algoritma apa yang akan digunakan? Itu tergantung pada tujuan Anda. Untuk meringkas dua jawaban teratas: tujuan checksum adalah " untuk mendeteksi kesalahan yang paling umum ". Pilih algoritme yang menghasilkan checksum berbeda, untuk kesalahan apa pun yang "paling umum" dalam skenario Anda. Jika Anda khawatir tentang satu atau dua bit yang diubah, Anda dapat memilih algoritme yang menjamin deteksi kesalahan spesifik itu! Ini adalah pertukaran yang sangat spesifik.
ToolmakerSteve
1
@DanStahlke - di sisi lain, kode hash mencakup berbagai kemungkinan trade-off. Jika yang kita maksud adalah nilai yang digunakan dalam membuat tabel hash, kita tahu bahwa akan ada benturan, banyak sekali. Ini adalah trade-off yang sangat berbeda (dari checksum). Kami mencoba mengurangi tabrakan rata-rata . Kami tidak menjamin apapun. Mungkin ada beberapa input yang berbeda hanya satu bit, namun menghasilkan hash yang sama. Ini baik-baik saja, jika rata-rata kami mendapatkan penyebaran nilai hash yang baik. Namun tidak akan dapat diterima untuk checksum.
ToolmakerSteve

Jawaban:

72

Saya akan mengatakan bahwa checksum selalu merupakan kode hash . Namun, tidak semua kode hash membuat checksum yang baik.

Sebuah checksum memiliki tujuan khusus --- ia memverifikasi atau memeriksa integritas data (beberapa dapat melampaui itu dengan memungkinkan koreksi kesalahan ). Checksum yang "baik" mudah dihitung, dan dapat mendeteksi banyak jenis kerusakan data (misalnya satu, dua, tiga bit yang salah).

Kode hash secara sederhana mendeskripsikan fungsi matematika yang memetakan data ke beberapa nilai. Ketika digunakan sebagai alat pengindeksan dalam struktur data (misalnya tabel hash), probabilitas tabrakan yang rendah diinginkan.

Zach Scrivena
sumber
6
Mungkin yang satu dapat digunakan sebagai yang lain, tetapi mengingat mereka memiliki tujuan desain yang berbeda, ini hanya membingungkan masalah.
Wim Coenen
8
@ gumbo: tidak, tidak semua kode hash adalah checksum. Lihat contoh string dari MSalters di bawah ini.
MarcH
41

Ada tujuan berbeda di balik masing-masingnya:

  • Kode hash - dirancang secara acak di seluruh domainnya (untuk meminimalkan tabrakan dalam tabel hash dan semacamnya). Kode hash kriptografi juga dirancang agar secara komputasi tidak dapat dibalik.
  • Check sum - dirancang untuk mendeteksi kesalahan paling umum dalam data dan sering kali cepat dihitung (untuk checksumming aliran cepat data yang efektif).

Dalam praktiknya, fungsi yang sama sering kali baik untuk kedua tujuan tersebut. Secara khusus, kode hash yang kuat secara kriptografis adalah checksum yang bagus (hampir tidak mungkin kesalahan acak akan merusak fungsi hash yang kuat), jika Anda mampu membayar biaya komputasi.

Rafał Dowgird
sumber
1
Juga ada baiknya untuk menyebutkan bahwa versi non-kriptografi dari kode hash dapat memberikan pertukaran yang baik antara waktu komputasi (mendekati CRC) dan deteksi kesalahan, baik itu disengaja atau hanya kesalahan komunikasi / pembusukan bit (CRC tidak dapat diharapkan untuk mendeteksi gangguan yang disengaja karena relatif mudah untuk sengaja merancang tabrakan).
gaborous
1
Bagi saya, frase kunci dalam jawaban Anda, adalah bahwa checksum dirancang untuk mendeteksi kesalahan paling umum . Ya itu dia. itu adalah algoritma hash yang telah dipilih untuk menghasilkan nilai yang berbeda untuk kemungkinan kerusakan data. Itu adalah tujuan tertentu, dan mengarah ke algoritme tertentu, yang mengoptimalkannya - tergantung pada jenis gangguan yang dikhawatirkan.
ToolmakerSteve
22

Memang ada beberapa perbedaan:

  • Checksum hanya perlu berbeda jika inputnya berbeda (sesering mungkin), tetapi penghitungannya cepat hampir sama pentingnya.
  • Kode hasht (untuk digunakan dalam hashtable) memiliki persyaratan yang sama, dan juga harus didistribusikan secara merata di seluruh ruang kode, terutama untuk input yang serupa.
  • Hash kriptografi memiliki persyaratan yang jauh lebih ketat daripada hash, Anda tidak dapat membuat input yang menghasilkan hash ini. Waktu komputasi berada di urutan kedua, dan tergantung pada aplikasinya bahkan mungkin diinginkan untuk hash menjadi sangat lambat untuk dihitung (untuk memerangi serangan brute force).
Michael Borgwardt
sumber
1
Saya tidak berpikir checksum berbeda untuk input yang berbeda memiliki manfaat apa pun. Mereka hanya untuk memeriksa integritas, bukan untuk mencirikan.
pengguna541686
1
@ Mehrdad: jadi bagaimana Anda mengusulkan pemeriksaan integritas tanpa mendapatkan hasil yang berbeda untuk input yang berbeda?
Michael Borgwardt
Eh, mungkin saya salah bicara dengan apa yang saya katakan? Saya mengacu pada bagian di mana Anda mengatakan "sejauh mungkin" - Saya hanya mengatakan tidak ada alasan bagi mereka untuk tidak dapat diprediksi atau "jauh" seperti hash. Selama ada beberapa perubahan dalam checksum ketika input mengalami perubahan yang khas, itu adalah checksum yang bagus. Bandingkan dengan hash, yang juga memiliki tujuan untuk mendistribusikan sesuatu secara merata / acak / tidak terduga / "sejauh" mungkin ke dalam codomain mereka.
pengguna541686
Saya pikir Anda hanya salah menafsirkan apa yang saya maksud dengan "sejauh mungkin" - yang saya maksudkan adalah tabrakan harus sesering mungkin, meskipun tentu saja itu tidak dapat dihindari. Saya akan mengubah kata-katanya.
Michael Borgwardt
@Mehrdad - pada awalnya itu tidak masuk akal bagi saya. Jika sebuah checksum tidak memiliki distribusi yang baik atas nilai checksum yang mungkin, itu berarti ada beberapa nilai checksum yang dikembalikan untuk lebih banyak nilai input (daripada checksum lainnya). Tapi, itu mengurangi kegunaan checksum? [Ini meningkatkan kemungkinan bahwa data yang terganggu akan mengembalikan hasil yang sama, kan?] Hmm, saya salah, Anda benar: checksum hanya harus pandai mendeteksi kemungkinan gangguan. Itu mungkin tidak memerlukan distribusi yang merata di semua nilai.
ToolmakerSteve
10

Hashcode dan checksum keduanya digunakan untuk membuat nilai numerik pendek dari item data. Perbedaannya adalah bahwa nilai checksum harus berubah, meskipun sedikit modifikasi dilakukan pada item data. Untuk nilai hash, persyaratannya hanyalah bahwa item data dunia nyata harus memiliki nilai hash yang berbeda.

Contoh yang jelas adalah string. Sebuah checksum untuk sebuah string harus mencakup setiap bit, dan urutannya penting. Di sisi lain, kode hash sering kali dapat diimplementasikan sebagai checksum dari awalan dengan panjang terbatas. Itu berarti bahwa "aaaaaaaaaaba" akan memiliki hash yang sama dengan "aaaaaaaaaaab", tetapi algoritme hash dapat menangani benturan semacam itu.

MSalters
sumber
Jawaban ini adalah yang membunyikan bel bagi saya. Jadi integritas data bukanlah fokus dari hash.
truthadjustr
9

Wikipedia menjelaskannya dengan baik:

Fungsi checksum terkait dengan fungsi hash, sidik jari, fungsi pengacakan, dan fungsi hash kriptografi. Namun, masing-masing konsep tersebut memiliki aplikasi yang berbeda dan karenanya memiliki tujuan desain yang berbeda. Digit cek dan bit paritas adalah kasus khusus checksum, sesuai untuk blok kecil data (seperti nomor Jaminan Sosial, nomor rekening bank, kata komputer, byte tunggal, dll.). Beberapa kode koreksi kesalahan didasarkan pada checksum khusus yang tidak hanya mendeteksi kesalahan umum tetapi juga memungkinkan data asli dipulihkan dalam kasus tertentu.

Jon Skeet
sumber
28
Setelah membaca itu, saya masih bertanya-tanya apa bedanya.
kirk.burleson
@ kirk.burleson - Saya akan mengatakan bahwa mereka memiliki prinsip yang sama , tetapi dalam praktiknya orang selalu membuat pengorbanan . Dalam situasi yang berbeda, pengorbanan yang berbeda berlaku, sehingga pendekatan yang berbeda digunakan. Bukan pembenaran karena ada dua kata yang berbeda, hanya mengatakan bahwa jika Anda mencari teknik yang baik untuk checksum, Anda mungkin menemukan sekumpulan algoritme yang berbeda daripada saat mencari kode hash.
ToolmakerSteve
5

Sebuah checksum melindungi dari perubahan yang tidak disengaja.

Hash kriptografi melindungi dari penyerang yang sangat termotivasi.

Ketika Anda mengirim bit pada kabel, mungkin secara tidak sengaja terjadi bahwa beberapa bit dibalik, atau dihapus, atau dimasukkan. Untuk memungkinkan penerima mendeteksi (atau terkadang memperbaiki) kecelakaan seperti ini, pengirim menggunakan checksum.

Tetapi jika Anda berasumsi ada seseorang yang secara aktif dan cerdas memodifikasi pesan di kabel dan Anda ingin melindungi dari penyerang semacam ini, maka gunakan hash kriptografik (saya mengabaikan tanda tangan kriptografik, atau menggunakan saluran sekunder atau semacamnya, karena pertanyaannya sepertinya tidak luput dari ini).

pengguna3464863
sumber
3
"hash kriptografi" meningkatkan kebingungan antara "hash" dan "checksum". "checksum kriptografi" lebih baik karena tidak.
MarcH
5

Meskipun hashing dan checksum serupa karena keduanya membuat nilai berdasarkan konten file, hashing tidak sama dengan membuat checksum. Checksum dimaksudkan untuk memverifikasi (memeriksa) integritas data dan mengidentifikasi kesalahan transmisi data, sedangkan hash dirancang untuk membuat sidik jari digital unik dari data tersebut.

Sumber: CompTIA ® Keamanan + Panduan Dasar-Dasar Keamanan Jaringan - Edisi Kelima - Mark Ciampa -Halaman 191

N Randhawa
sumber
4

Hari-hari ini mereka dapat dipertukarkan, tetapi di zaman dahulu kala checksum adalah teknik yang sangat sederhana di mana Anda akan menambahkan semua data (biasanya dalam byte) dan menempatkan satu byte pada akhirnya dengan nilai itu dalam .. maka Anda akan mudah-mudahan mengetahui jika ada data asli yang rusak. Mirip dengan bit centang, tetapi dengan byte.

Steven Robbins
sumber
4

Perbedaan antara fungsi kode hash dan checksum adalah, keduanya dirancang untuk tujuan yang berbeda.

  • Sebuah checksum digunakan untuk mengetahui apakah sesuatu di masukan telah berubah.

  • Kode hash digunakan untuk mengetahui apakah sesuatu dalam input telah berubah dan memiliki "jarak" sebanyak mungkin antara nilai kode hash individu.

    Selain itu, mungkin ada persyaratan lebih lanjut untuk fungsi hash, yang bertentangan dengan aturan ini, seperti kemampuan untuk membentuk hierarki / klaster / keranjang nilai kode hash lebih awal.

    Dan jika Anda menambahkan beberapa pengacakan awal bersama, Anda mendapatkan konsep untuk enkripsi / pertukaran kunci modern.


Tentang Probabilitas:

Sebagai contoh, mari kita asumsikan bahwa data masukan sebenarnya selalu berubah (100% dari waktu). Dan anggaplah Anda memiliki fungsi hash / checksum yang "sempurna", yang menghasilkan nilai hash / checksum 1-bit. Oleh karena itu, Anda akan mendapatkan nilai hash / checksum yang berbeda, 50% dari waktu, untuk data masukan acak.

  • Jika tepat 1 bit dalam data masukan acak Anda telah berubah, Anda akan dapat mendeteksi 100% waktu tersebut, tidak peduli seberapa besar data masukan tersebut.

  • Jika 2 bit dalam data masukan acak Anda telah berubah, kemungkinan Anda untuk mendeteksi "perubahan" dibagi 2, karena kedua perubahan tersebut dapat saling menetralkan, dan tidak ada fungsi hash / checksum yang akan mendeteksi bahwa 2 bit sebenarnya berbeda dalam data masukan .

    ...

Artinya, Jika jumlah bit dalam data input Anda beberapa kali lebih besar dari jumlah bit dalam nilai hash / checksum Anda, kemungkinan Anda untuk benar-benar mendapatkan nilai hash / checksum yang berbeda, untuk nilai input yang berbeda, berkurang dan bukan a konstan .

Sascha Wedler
sumber
2

Saya cenderung menggunakan kata checksum saat mengacu pada kode (numerik atau lainnya) yang dibuat untuk file atau bagian data yang dapat digunakan untuk memeriksa bahwa file atau data tidak rusak. Penggunaan paling umum yang saya temui adalah untuk memeriksa bahwa file yang dikirim melalui jaringan belum diubah (sengaja atau tidak).

Ian1971
sumber
1
Karena checksum tidak dibuat sulit untuk dibalik, hal ini menunjukkan bahwa checksum tidak akan baik untuk memeriksa apakah ada sesuatu yang sengaja diubah.
benblasdell
0

Dalam sharding data cluster Redis, ia menggunakan a hash slotuntuk memutuskan node mana yang akan digunakan. Ambil contoh operasi modulo di bawah ini:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

The 6muncul dua kali di berbeda input. Tujuan dari hash hanyalah untuk memetakan nilai input ke nilai output dan keunikan bukanlah bagian dari kesepakatan. Jadi, dua input berbeda yang menghasilkan output yang sama tidak masalah di dunia hash.

Sebuah checksum, di sisi lain, harus membedakan output meskipun satu bit dalam input berubah karena tujuannya bukan untuk memetakan, tetapi untuk mendeteksi kerusakan data. Jadi, dua input berbeda yang menghasilkan output yang sama tidak dapat diterima di checksum.

kebenaranadjustr
sumber
-4

Sebuah checksum hanyalah angka yang dihasilkan dari bidang data dengan oring (dengan penambahan logis maka jumlah). Checksum memiliki kemampuan untuk mendeteksi kerusakan bit atau jumlah bit apa pun di dalam bidang data dari mana ia dihasilkan, yaitu memeriksa semua kesalahan, tidak dapat memperbaikinya. Checksum adalah hash karena ukuran checksum lebih kecil dari data asli. Ya, Anda akan mengalami benturan karena checksum sama sekali tidak sensitif terhadap posisi bit di bidang data.

Cyclic redundancy check (CRC) adalah sesuatu yang sangat berbeda, lebih kompleks dan TIDAK disebut checksum. Ini adalah aplikasi dari rangkaian polinomial yang memiliki kemampuan untuk mengoreksi sejumlah bit rusak individu yang dipilih dalam bidang data tempat ia dihasilkan. Pembuatan hasil CRC dalam ukuran yang lebih besar dari datafield asli (tidak seperti checksum) - maka nama termasuk kata "redundansi" dan harga yang Anda bayarkan untuk kemampuan mengoreksi kesalahan. Oleh karena itu, CRC BUKAN hash dan tidak boleh disalahartikan atau dinamai sebagai checksum, karena redundansi selalu menambah ukuran data asli.

CapitainSensible
sumber