Bcrypt Generator & Verifier — Hash Password ala PHP password_hash()
Generate hash bcrypt ($2y$, $2a$, $2b$) untuk password dan verifikasi. Kompatibel dengan PHP password_hash() / password_verify().
Apa itu Bcrypt?
Bcrypt adalah algoritma hashing password yang dirancang lambat secara sengaja — supaya brute-force jadi mahal bagi attacker. Dipakai default oleh PHP password_hash(), Laravel, Symfony, Rails, Spring Security, dan hampir semua framework modern.
Anatomi Hash Bcrypt
Contoh: $2y$10$8VASEhyzqXrxNkcy/63sHu5k9IGPEsbBWlPt0oaEtHyyPCc83a..i
$2y$— identifier varian.$2a$,$2b$,$2y$semua bcrypt, cuma beda fix bug. PHPpassword_hash()pakai$2y$.10— cost factor (log2 iterasi). 10 = 2¹⁰ = 1024 iterasi. Tiap +1 → 2x lebih lambat.- 22 karakter berikutnya — salt (base64-modified).
- 31 karakter terakhir — hash.
Cost Factor — Pilih Berapa?
- 10 — default PHP, ~80ms di server modern. Cukup untuk kebanyakan aplikasi.
- 12 — ~320ms, rekomendasi OWASP 2023+. Lebih tahan brute-force.
- 14 — ~1.3 detik, untuk akun admin / keuangan.
- Di atas 14 — mulai bikin user experience lambat. Naikkan seiring CPU makin kencang.
Cara Pakai di PHP
// Generate hash
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Simpan $hash ke database
// Verifikasi saat login
if (password_verify($input, $storedHash)) {
// ✅ password benar
}
// Cek apakah perlu rehash (cost lama / algo upgrade)
if (password_needs_rehash($storedHash, PASSWORD_BCRYPT, ['cost' => 12])) {
$newHash = password_hash($input, PASSWORD_BCRYPT, ['cost' => 12]);
}
Bcrypt vs MD5 vs SHA-256
MD5 dan SHA-256 jangan dipakai untuk password. Mereka dirancang cepat — attacker bisa coba miliaran kombinasi per detik pakai GPU. Bcrypt sengaja lambat + punya salt built-in → cracking 1 password butuh waktu berhari-hari/bulanan.
Alternatif modern: Argon2id (PHP 7.2+, PASSWORD_ARGON2ID) dan scrypt. Argon2id bahkan lebih tahan GPU attack, tapi bcrypt masih aman & lebih banyak dipakai.
Batas Panjang Password
⚠️ Bcrypt cuma hash 72 byte pertama dari input. Password > 72 karakter → sisanya diabaikan. Solusi modern: pre-hash dulu dengan SHA-256 (hash('sha256', $password, true)) sebelum di-bcrypt, atau pakai Argon2id.
FAQ
$2a$ vs $2y$ vs $2b$ beda ga?
Secara praktis identik untuk password normal. $2a$ original, $2y$ PHP-specific (fix bug 2011), $2b$ OpenBSD. Semua bisa diverifikasi oleh password_verify().
Data aman?
100% di browser (pakai library bcryptjs). Tidak ada yang dikirim ke server.
Kenapa hash beda tiap generate?
Salt di-generate acak tiap call. Itu fitur — 2 user dengan password sama punya hash berbeda. password_verify() tetap match karena salt embed di hash.