Bertentangan dengan apa yang ditekankan oleh jawaban yang paling disukai di sini, non-injeksi (yaitu ada beberapa string yang memiliki nilai yang sama) dari fungsi hash kriptografi yang disebabkan oleh perbedaan antara ukuran masukan yang besar (kemungkinan tidak terbatas) dan ukuran keluaran tetap tidak poin penting - sebenarnya, kami lebih suka fungsi hash di mana tabrakan itu jarang terjadi.
Pertimbangkan fungsi ini (dalam notasi PHP, sebagai pertanyaannya):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
Ini menambahkan beberapa spasi, jika string terlalu pendek, lalu mengambil 16 byte pertama dari string tersebut, lalu mengkodekannya sebagai heksadesimal. Ini memiliki ukuran keluaran yang sama dengan hash MD5 (32 karakter heksadesimal, atau 16 byte jika kita menghilangkan bagian bin2hex).
print simple_hash("stackoverflow.com");
Ini akan menghasilkan:
737461636b6f766572666c6f772e636f6d
Fungsi ini juga memiliki properti non-injeksi yang sama seperti yang disorot oleh jawaban Cody untuk MD5: Kita dapat mengirimkan string dengan ukuran berapa pun (asalkan sesuai dengan komputer kita), dan hanya akan menghasilkan 32 digit hex. Tentu saja tidak bisa injeksi.
Tetapi dalam kasus ini, sangat mudah untuk menemukan string yang memetakan ke hash yang sama (cukup terapkan hex2bin
pada hash Anda, dan Anda memilikinya). Jika string asli Anda memiliki panjang 16 (seperti contoh kami), Anda bahkan akan mendapatkan string asli ini. Hal semacam ini seharusnya tidak mungkin dilakukan untuk MD5, bahkan jika Anda mengetahui panjang masukan cukup pendek (selain dengan mencoba semua masukan yang mungkin sampai kami menemukan salah satu yang cocok, misalnya serangan brute-force).
Asumsi penting untuk fungsi hash kriptografi adalah:
- Sulit untuk menemukan string apa pun yang menghasilkan hash tertentu (resistansi preimage)
- Sulit untuk menemukan string berbeda yang menghasilkan hash yang sama dengan string yang diberikan (resistansi preimage kedua)
- sulit untuk menemukan pasangan string dengan hash yang sama (ketahanan benturan)
Jelas simple_hash
fungsi saya memenuhi tidak satu pun dari kondisi ini. (Sebenarnya, jika kita membatasi ruang input ke "string 16-byte", maka fungsi saya menjadi injektif, dan dengan demikian bahkan dapat dibuktikan tahan gambar sebelumnya dan tahan benturan.)
Sekarang ada serangan tabrakan terhadap MD5 (misalnya dimungkinkan untuk menghasilkan sepasang string, bahkan dengan awalan yang sama, yang memiliki hash yang sama, dengan cukup banyak pekerjaan, tetapi bukan tidak mungkin banyak pekerjaan), jadi Anda tidak boleh menggunakan MD5 untuk segala hal yang penting. Belum ada serangan preimage, tapi serangan akan menjadi lebih baik.
Untuk menjawab pertanyaan sebenarnya:
Ada apa dengan fungsi-fungsi ini yang membuat string yang dihasilkan tidak mungkin dilacak kembali?
Apa yang MD5 (dan fungsi hash lainnya dibangun di atas konstruksi Merkle-Damgard) secara efektif lakukan adalah menerapkan algoritma enkripsi dengan pesan sebagai kuncinya dan beberapa nilai tetap sebagai "teks biasa", menggunakan ciphertext yang dihasilkan sebagai hash. (Sebelumnya, input diisi dan dipisahkan dalam blok, masing-masing blok ini digunakan untuk mengenkripsi output dari blok sebelumnya, XOR dengan inputnya untuk mencegah penghitungan terbalik.)
Algoritme enkripsi modern (termasuk yang digunakan dalam fungsi hash) dibuat sedemikian rupa sehingga sulit untuk memulihkan kunci, bahkan diberikan plaintext dan ciphertext (atau bahkan saat musuh memilih salah satunya). Mereka melakukan ini secara umum dengan melakukan banyak operasi bit-shuffle sedemikian rupa sehingga setiap bit keluaran ditentukan oleh setiap bit kunci (beberapa kali) dan juga setiap bit masukan. Dengan cara itu Anda hanya dapat dengan mudah menelusuri kembali apa yang terjadi di dalam jika Anda mengetahui kunci lengkap dan input atau output.
Untuk fungsi hash seperti MD5 dan serangan preimage (dengan string hash blok tunggal, untuk mempermudah), Anda hanya memiliki input dan output dari fungsi enkripsi Anda, tetapi bukan kuncinya (inilah yang Anda cari).