Hash Kata Sandi dengan bcrypt


Dalam sejarah autentikasi, kita telah mengetahui bahwa menyimpan kata sandi dengan menggunakan plaintext adalah pilihan yang buruk karena serangan keamanan dapat dengan mudah mendapatkan kredensial pengguna. Sebaliknya, kita ingin membuat penyimpanan kata sandi satu arah dengan melakukan hashing pada kata sandi. Namun, peneliti juga mengeksplorasi bahwa hashing saja tidak cukup untuk memitigasi serangan yang lebih terlibat dalam proses hashing seperti rainbow table.

Terdapat berbagai fungsi kriptografi yang dapat dipakai, yang termasuk jenis algoritma SHA2 dan SHA-3. Namun, kelemahan dari fungsi-fungsi ini adalah mengutamakan kecepatan, yang dapat berdampak pada keamanan kata sandi. Semakin cepat perhitungan komputasi, semakin mudah bagi peretas untuk melancarkan serangan brute force. Perangkat keras modern dapat menghitung hash SHA-256 dalam jumlah besar per detik, yang dapat digunakan untuk memecahkan database yang dicuri.

Untuk mengatasi metode serangan ini, kita dapat mengembangkan fungsi hash kriptografi yang dapat disesuaikan agar berjalan lebih lambat pada perangkat keras yang lebih baru. Hal ini penting karena orang-orang sering kali menggunakan kata sandi dengan panjang yang sama, sehingga memudahkan penyerang. Oleh karena itu, ketika merancang solusi kriptografi, kita perlu mempertimbangkan perangkat keras yang terus berubah dan panjang kata sandi yang konsisten. Kriptografer di tahun 90an sudah familiar dengan jenis serangan ini, dan pada tahun 1999, sebuah algoritma yang disebut bcrypt diperkenalkan di USENIX untuk mengatasi masalah ini.

Apa itu bcrypt?

Bcrypt dirancang oleh Niels Provos dan David Mazières berdasarkan cipher Blowfish untuk Blowfish dan crypt untuk nama fungsi hashing yang digunakan oleh sistem kata sandi UNIX.

Crypt adalah contoh bagaimana fungsi kriptografi gagal mengikuti kemajuan teknologi. Pada tahun 1976, crypt dapat meng-hash beberapa kata sandi per detik, membuat Tim UNIX terlalu yakin dan percaya diri akan kelebihan crypt . Namun, 20 tahun kemudian, komputer yang cepat dapat melakukan hashing kata sandi dengan kecepatan yang jauh lebih cepat, yang menunjukkan perlunya adaptasi terhadap teknologi yang terus berkembang. Penyerang dapat dengan mudah melakukan dictionary attack karena kemajuan kecepatan perangkat keras. Untuk mengatasi hal ini, diperlukan kriptografi yang lebih kuat untuk memperlambat penyerang dan mempersulit mereka untuk memecahkan enkripsi.

Cipher Blowfish adalah cipher blok cepat kecuali saat mengubah kunci, parameter yang menetapkan output fungsional dari algoritma kriptografi: setiap kunci baru memerlukan pra-pemrosesan yang setara dengan mengenkripsi sekitar 4 kilobyte teks, yang dianggap sangat lambat dibandingkan dengan cipher blok lainnya. Perubahan kunci yang lambat ini bermanfaat untuk metode hashing kata sandi seperti bcrypt karena permintaan komputasi ekstra membantu melindungi terhadap dictionary attack dan brute force dengan memperlambat serangan.

Bcrypt adalah algoritma enkripsi yang menggabungkan fase pengaturan kunci Blowfish dengan beberapa iterasi untuk membuat penghitungan hash lebih memakan waktu sehingga membantu melindungi kata sandi terhadap serangan dengan memperlambat proses. Bcrypt juga dapat beradaptasi terhadap peningkatan daya komputasi dengan meningkatkan jumlah iterasi. Selain itu, bcrypt memerlukan penggunaan salt secara default, sehingga semakin meningkatkan keamanannya.

Bagaimana bcrypt bekerja?

Provos dan Mazières, perancang bcrypt, menggunakan fase expensive key schedule Blowfish dari cipher Blowfish untuk mengembangkan algoritma penyiapan kunci baru untuk Blowfish yang diberi nama “eksblowfish”, yang merupakan singkatan dari “expensive key schedule Blowfish”. Bcrypt terdiri dari dua fase, yaitu:

  1. Fase pertama
    Fungsi EksBlowfishSetup digunakan untuk menginisialisasi keadaan eksblowfish dengan memasukkan cost, salt, dan kata sandi yang diinginkan. Bcrypt kemudian melewati proses penjadwalan kunci yang memakan waktu, di mana subkunci diturunkan dari kunci utama (kata sandi). Jika kata sandi yang lemah atau pendek dipilih, kata sandi tersebut akan direntangkan untuk membuat kata sandi/kunci yang lebih panjang dan kuat, sebuah praktik yang dikenal sebagai key stretching. Pada fase awal ini, fokus algoritma adalah meningkatkan kekuatan kunci untuk menghambat kecepatan perhitungan komputasi, sehingga menghalangi potensi serangan keamanan.
  2. Fase Kedua
    Nilai magis dari algoritma bcrypt adalah nilai 192-bit OrpheanBeholderScryDoubt yang dienkripsi sebanyak 64 kali menggunakan eksblowfish pada mode ECB dengan status dari fase sebelumnya. Output dari fase ini adalah cost (salt round) dan nilai salt 128-bit yang digabungkan dengan hasil loop enkripsi. Hash yang dihasilkan diawali dengan `2a`, `2y`, atau `2b`. Awalan ditambahkan untuk menunjukkan penggunaan bcrypt dan versinya.

Hasil dari bcrypt dalam kata sandi ter-hash memberikan contoh karakteristik mendasar dari mekanisme kata sandi yang kuat seperti yang diuraikan oleh para penciptanya. cost-nya yang dapat disesuaikan menambah lapisan perlindungan ekstra. Ketika mempertimbangkan fleksibilitas cost, perlu dicatat bahwa bcrypt berfungsi sebagai fungsi hash serbaguna yang dapat menyesuaikan jumlah iterasi berdasarkan faktor kunci tertentu, yang dikenal sebagai cost. Kemampuan beradaptasi ini memungkinkan kita memitigasi dampak kemajuan daya komputasi. Namun, fleksibilitas ini menghadirkan trade-off antara kecepatan dan keamanan.

Best Practice Dalam Menggunakan bcrypt

Tantangan bagi security/software engineer adalah memutuskan berapa cost yang harus ditetapkan untuk fungsi bcrypt. Cost ini disebut juga dengan work factor. OWASP merekomendasikan sebagai aturan umum dalam pengaturan work factor untuk menyesuaikan cost sehingga fungsi berjalan selambat mungkin tanpa mempengaruhi pengalaman pengguna dan tanpa meningkatkan kebutuhan untuk menggunakan perangkat keras tambahan yang mungkin melebihi kemampuan.

Implementasi bcrypt Menggunakan PHP

Fungsi password_hash adalah fungsi bawaan dalam bahasa pemrograman PHP yang dapat digunakan untuk melakukan hash kata sandi dengan beberapa algoritma, termasuk bcrypt. Berikut adalah syntax fungsi beserta parameternya:

Contoh program

Berikut merupakan contoh program penggunaan fungsi password_hash:

Output:

$2y$12$McalwheVmR2tBZNY1n/KW.8kXC3MuaJL7EG.fRWV1appffrNIfhV2

Berdasarkan source code diatas, program menampilkan kata sandi yang telah diubah oleh proses hashing dan salting lewat fungsi password_hash yang menggunakan algoritma PASSWORD_BCRYPT dengan nilai opsi cost sebanyak 12 yang membuat proses hash menjadi lebih sulit untuk dikomputasi.