🔒

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().

Default PHP — cepat & cukup aman

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. PHP password_hash() pakai $2y$.
  • 10cost 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.