Hash

Apa Itu Fungsi Hash dan Bagaimana Cara Kerjanya?

Bagi beberapa orang mungkin tidak asing lagi mendengar atau melihat istilah Hash maupun Hashing. Terutama bagi para programmer yang sering kali memakai fungsi Hash pada programnya. Apa sih Hash atau Hashing itu?. Hash adalah suatu string atau data dari hasil pengkodean enkripsi yang pada umumnya terdiri dari huruf maupun angka yang acak dengan panjang data yang tetap. Fungsi hash adalah fungsi yang dapat digunakan untuk melakukan hashing terhadap sebuah data dengan ukuran beragam ke nilai ukuran tetap. Output yang dikembalikan oleh fungsi hash disebut nilai hash, kode hash, hashes, atau hash.

Bagaimana Cara Kerja Fungsi Hash?

Hashing mengubah sepotong data (kecil atau besar), menjadi potongan data yang relatif singkat seperti string atau integer. Hal ini dilakukan dengan menggunakan fungsi hash satu arah.”Satu arah” berarti sangat sulit (atau hampir tidak mungkin) membalikkannya.

Contoh umum dari fungsi hash adalah md5(), yang cukup populer di banyak bahasa dan sistem yang berbeda.

Dengan md5(), hasilnya akan selalu menjadi string sepanjang 32 karakter. Tapi, itu hanya berisi karakter heksadesimal; secara teknis juga dapat digambarkan sebagai integer 128-bit (16 byte). Anda mungkin md5() string dan data lebih panjang lagi, dan Anda masih akan berakhir dengan hash sepanjang ini. Fakta ini saja mungkin memberi petunjuk mengapa ini dianggap sebagai fungsi “satu arah”.

Menggunakan Fungsi Hash untuk Menyimpan Password

Pengguna mengisi form pendaftaran, termasuk field password. Script web menyimpan semua informasi ke dalam database. Namun, password dijalankan melalui fungsi hash, sebelum disimpan. Versi asli password belum disimpan di manapun, sehingga secara teknis ia dibuang. Pengguna memasukkan username (atau e-mail) dan password. Skrip menjalankan password melalui fungsi hashing yang sama.
Skrip menemukan record pengguna dari database, dan membaca password hash yang tersimpan.
Kedua nilai ini dibandingkan, dan akses diberikan jika cocok. Begitu kita memutuskan metode yang layak untuk memasukkan password-nya, kita akan menerapkan proses ini nanti di artikel ini.

Perhatikan bahwa password asli tidak pernah disimpan dimanapun. Jika database dicuri, user login tidak dapat dikompromikan, bukan? Nah, jawabannya adalah “tergantung.” Mari kita lihat beberapa masalah potensial.

Masalah #1: Tabrakan Hash

“Tabrakan” hash terjadi ketika dua input data yang berbeda menghasilkan hash yang sama. Kemungkinan terjadinya hal ini tergantung pada fungsi mana yang Anda gunakan. Bagaimana ini bisa dieksploitasi? Sebagai contoh, saya telah melihat beberapa skrip lama yang menggunakan crc32() untuk hash password. Fungsi ini menghasilkan integer 32-bit sebagai hasilnya. Ini berarti hanya ada 2^32 (yaitu 4.294.967.296) kemungkinan hasilnya.

Mari hash sebuah password:

Sekarang, mari kita asumsikan peran seseorang yang telah mencuri database, dan memiliki nilai hash. Kita mungkin tidak dapat mengubah 323322056 menjadi ‘supersecretpassword’, namun kita dapat menemukan kata kunci lain yang akan dikonversi ke nilai hash yang sama, dengan skrip sederhana

Ini mungkin berjalan untuk sementara waktu, meskipun, akhirnya, itu seharusnya mengembalikan sebuah string. Kita bisa menggunakan string yang dikembalikan ini — alih-alih ‘supersecretpassword’ — dan ini akan memungkinkan kita berhasil masuk ke akun orang itu.

Misalnya, setelah menjalankan skrip tepat ini beberapa saat di komputer saya, saya diberi ‘MTIxMjY5MTAwNg==’. Mari kita mengujinya:

Bagaimana ini bisa dicegah? Saat ini, komputer yang kuat dapat digunakan untuk menjalankan fungsi hash hampir satu miliar kali per detik. Jadi kita butuh fungsi hash yang memiliki rentang sangat besar. Misalnya, md5() mungkin cocok, karena menghasilkan hash 128-bit. Ini berarti 340.282.366.920.938.463.463.374.607.431.768.211.456 hasil yang mungkin. Tidak mungkin untuk melewati banyak iterasi untuk menemukan tabrakan hash. Namun beberapa orang masih menemukan cara untuk melakukan ini. Sha1() adalah alternatif yang lebih baik, dan menghasilkan nilai hash 160-bit yang lebih panjang.

Masalah #2: rainbow table

Bahkan jika kita memperbaiki masalah tabrakan, kita masih belum aman. Sebuah rainbow table dibangun dengan menghitung nilai hash dari kata-kata yang umum digunakan dan kombinasinya. Tabel ini bisa memiliki jutaan atau bahkan milyaran baris. Misalnya, Anda bisa membaca kamus, dan menghasilkan nilai hash untuk setiap kata. Anda juga bisa mulai menggabungkan kata-kata bersama-sama, dan menghasilkan hash untuk mereka juga. Anda bahkan bisa mulai menambahkan angka sebelum / sesudah / di antara kata-kata, dan menyimpannya di rainbow table. Mengingat betapa murahnya penyimpanan cloud saat ini, rainbow table raksasa dapat diproduksi dan digunakan.

Bagaimana ini bisa dieksploitasi? Mari kita bayangkan bahwa database besar dicuri, bersama dengan 10 juta hash kata sandi. Cukup mudah untuk mencari rainbow table untuk masing-masing. Tidak semua dari mereka akan ditemukan, tentu saja, tapi tetap saja…beberapa dari mereka akan ditemukan!

Bagaimana ini bisa dicegah? Kita dapat mencoba menambahkan “salt”. Berikut adalah contohnya

Apa yang kita lakukan pada dasarnya adalah menggabungkan string “salt” dengan password sebelum meng-hash. String yang dihasilkan jelas tidak akan ada pada tabel pelangi yang pre-built. Tapi, kita masih belum aman!

Masalah #3: Kecepatan Hash

Sebagian besar fungsi hashing telah dirancang dengan kecepatan dalam pikiran, karena sering digunakan untuk menghitung nilai checksum untuk kumpulan data dan file yang besar, untuk memeriksa integritas data.

Bagaimana ini bisa dieksploitasi? Seperti yang saya sebutkan sebelumnya, PC modern dengan GPU card yang hebat dapat diprogram untuk menghitung kira-kira satu miliar hash per detik. Dengan cara ini, mereka bisa menggunakan serangan brute force untuk mencoba setiap kemungkinan password.

Anda mungkin berpikir bahwa membutuhkan panjang password minimal 8 karakter mungkin akan menjaganya tetap aman dari serangan brute force, namun mari kita tentukan apakah memang benar masalahnya:

Jika password dapat berisi huruf kecil, huruf besar dan angka, yaitu 62 (26+26+10) karakter yang mungkin. String sepanjang 8 karakter memiliki 62^8 versi yang mungkin.Itu sedikit di atas 218 triliun.
Pada tingkat 1 miliar hash per detik, itu bisa dipecahkan sekitar 60 jam. Dan untuk password panjang 6 karakter, yang juga cukup umum, akan memakan waktu kurang dari 1 menit.

Jangan ragu untuk meminta password sepanjang 9 atau 10 karakter, namun Anda mungkin mulai mengganggu beberapa pengguna Anda. Bayangkan bahwa Anda menggunakan fungsi hash yang hanya bisa berjalan 1 juta kali per detik pada perangkat keras yang sama, bukan 1 miliar kali per detik. Ini kemudian akan membawa penyerang 1000 kali lebih lama untuk brute force sebuah hash. 60 jam akan berubah menjadi hampir 7 tahun! Sebagai contoh fungsi hash yang sangat kuat adalah Bcrypt dan Bcrypt Blowfish.

5 1 vote
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
Translate »
0
Would love your thoughts, please comment.x
()
x