Sejarah Hashing
Fungsi hash generik adalah jenis fungsi pengaturcaraan khas yang digunakan untuk memetakan data ukuran sewenang-wenang ke data ukuran tetap. Fungsi Hash berasal dari keperluan untuk memampatkan data untuk mengurangkan jumlah memori yang diperlukan untuk menyimpan fail besar. Kes penggunaan yang paling popular untuk fungsi hash adalah untuk struktur data khusus lain yang disebut a jadual hash, yang banyak digunakan untuk pencarian data yang pantas. Fungsi Hash membantu mempercepat pencarian jadual atau pangkalan data dengan mengesan dua hash yang sama persis.
Mereka juga membantu meminimumkan tag untuk fail besar seperti mp3, PDF atau gambar untuk membuat kerja dengan jenis fail yang agak besar ini dapat dikendalikan. Untuk pengenalan pantas, syarat utama fungsi hash adalah mereka mengeluarkan rentetan panjang huruf alfanumerik.
Walaupun sebab utama permulaan fungsi hash berasal dari keperluan untuk memampatkan kandungan, manfaat sekunder segera menjadi pokok hash: pengenal unik-unik. Sebaik-baiknya, ketika mencirikan banyak mesej, tidak ada dua mesej yang berbeza yang mesti mengembalikan hash yang sama. Dua mesej hash yang berbeza menghasilkan hash output yang sama disebut a perlanggaran.
Dari perspektif pengurusan pangkalan data, ini bermaksud bahawa dua objek yang berbeza akhirnya disimpan dalam sel yang sama – tidak ada gunanya jika seseorang ingin menentukan pengecam unik. Sekiranya kita menganggap fungsi hash dengan input yang tidak terhingga (bermaksud kita dapat mencantumkan rentetan apa pun), kita dapat memperoleh tepat mengapa perlanggaran sebenarnya berlaku tidak dapat dielakkan.
Prinsip Lubang Merpati
Dalam matematik kriptografi terdapat konsep yang disebut prinsip pigeonhole yang menyatakan bahawa jika kita memasukkan (n) unsur ke dalam (m) ruang di mana n > m, maka, secara prinsip, terdapat sekurang-kurangnya satu ruang (m) yang dihuni oleh lebih dari dua elemen (n).
Sebagai contoh, lima individu memeriksa kot mereka di salah satu daripada tiga ketulan kot yang ada. Dengan prinsip lubang merpati, kerana jumlah lapisan yang disimpan (n) lebih besar daripada kubis yang tersedia (m), dijamin sekurang-kurangnya satu cubby memegang lebih dari satu lapisan.
Biasanya jurutera perisian berminat dengan fungsi hash dengan domain yang tidak terhingga (ini bermaksud mereka mengambil rentetan input dari semua kemungkinan panjang) dan a julat terhingga. Sekali lagi mengikuti prinsip pigeonhole, kerana julat kami (n) lebih kecil daripada domain kami (m), ia mengikuti bahawa pada sekurang-kurangnya satu perlanggaran mesti ada. Oleh itu, fungsi hash yang berkesan hanya dapat meminimumkan jumlah perlanggaran – mengapa perkara ini menjadi lebih jelas dalam sekejap, tetapi buat masa ini, mari kita kembali ke sejarah hash.
Walaupun fungsi hash berasal sepenuhnya dari pemeliharaan pangkalan data & keperluan pengurusan, yang mengutamakan kepantasan, utiliti mereka dengan cepat berkembang. Satu cabang khas fungsi hash yang memihak kepada privasi, keselamatan, & ketelusan segera memasuki lapangan; cabang fungsi hash yang akan tetap menjadi tumpuan artikel ini: fungsi hash kriptografi.
Pencitraan Kriptografi
Fungsi hash kriptografi, seperti namanya, menyokong pemeliharaan mesej yang sama sekali tidak terganggu. Walaupun meminimumkan perlanggaran adalah amalan yang baik untuk fungsi hash lain, untuk fungsi kriptografi secara khusus, meminimumkan perlanggaran adalah keperluan. Daripada memaksimumkan utiliti untuk senario pangkalan data atau pencarian jadual yang cepat, fungsi hash kriptografi dibina dengan mempertimbangkan senario lawan: satu di mana pemecah kod (cryptoanalyst) secara aktif berusaha untuk menyebabkan perlanggaran. Kami sekarang akan menentukan notasi fungsi hash standard & menetapkan prinsip fungsi hash dalam perspektif kriptografi.
Notasi Fungsi Hash
Fungsi hash kriptografi generik mempunyai dua input: mesej yang akan dimampatkan atau hash (x) & kunci awam yang mewakili output panjang tetap hash kami dalam aksara alfanumerik. Hasil hash kami disebut sebagai intisari pesan atau hanya dicerna (x *). Ini seperti berikut:
H (s, x) = x *
Mari kita baca notasi ini dengan membaca contoh kehidupan nyata yang merangkai rentetan menggunakan fungsi hashing standard sebelumnya yang dinamakan MD5. Katakanlah kita ingin menggunakan MD5 untuk mencirikan “Hello World!” tali. Kami juga tahu bahawa secara lalai MD5 selalu mengeluarkan rentetan 128 bit (0 & 1). Notasi ini akan kelihatan seperti berikut:
H (128, x) = ed076287532e86365e841e92bfc50d8c
Sebenarnya, jika anda teruskan & cuba sediakan fungsi hash MD5 “Hello World!” anda sendiri mesti melihat hash yang sama. Hebat. Sekarang mari kita bergerak ke hadapan untuk menetapkan notasi perlanggaran; sebagai tambahan kepada pemboleh ubah sebelumnya H, s, x, & x * sekarang kami memperkenalkan mesej kedua (x ‘). Secara numerik, perlanggaran berlaku ketika mencantumkan dua mesej yang berbeza (x & x ‘) menghasilkan intisari mesej yang sama (x *):
Sekiranya H (128, x) = H (128, x ‘), fungsi hash kami (H) dikatakan mengalami perlanggaran pada x & x ’.
Kami sekarang telah menetapkan notasi untuk standard ciri kriptografi fungsi hash terkini; jika lawan boleh berlaku (secara komputasi) menyebabkan perlanggaran, fungsi hash tidak lagi dianggap selamat secara praktikal.
Menutup Fikiran Hingga Ke Lain Kali
Definisi matematik terakhir adalah tempat praktikal fungsi catch-22 untuk fungsi hash hidup. Fungsi Hash berasal dari keperluan untuk memampatkan & mengeluarkan data seragam standard untuk kemudahan penyimpanan, yang bermaksud mereka mengeluarkan tali pseudorandom a panjang tetap. Namun untuk mewujudkan a tahan pelanggaran sepenuhnya fungsi hash, setiap satu mesej (x) harus mempunyai output hash dari panjang yang sama dengan input. Tanpa hash dengan panjang tetap, kita kehilangan kemampuan untuk menggunakannya sebagai struktur data yang mudah, namun dengan memberikan panjang tetap, kita menjadikan fungsi hash kita tidak sepenuhnya bebas dari perlanggaran.
PS – Saya pasti sebilangan dari anda cookie pintar memperhatikan bahawa dalam contoh MD5 kami mencatat fungsi hash yang mengembalikan rentetan panjang 128, namun “Hello World!” kami hash kembali a 32 rentetan aksara alfanumerik. Kembali lain kali & kita akan mempelajari lebih lanjut fungsi hash untuk menjelaskan di mana perbezaan ini berpunca.