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:
- Fase pertama
FungsiEksBlowfishSetup
digunakan untuk menginisialisasi keadaaneksblowfish
dengan memasukkancost
,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. - Fase Kedua
Nilai magis dari algoritmabcrypt
adalah nilai 192-bitOrpheanBeholderScryDoubt
yang dienkripsi sebanyak 64 kali menggunakaneksblowfish
pada mode ECB dengan status dari fase sebelumnya. Output dari fase ini adalahcost
(salt round) dan nilaisalt
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.