Jadi, Anda ingin menggunakan bcrypt? Luar biasa! Namun, seperti bidang kriptografi lainnya, Anda tidak harus melakukannya sendiri. Jika Anda perlu khawatir tentang hal-hal seperti mengelola kunci, atau menyimpan garam atau menghasilkan angka acak, Anda salah melakukannya.
Alasannya sederhana: sangat mudah untuk mengacaukan bcrypt . Bahkan, jika Anda melihat hampir setiap bagian kode pada halaman ini, Anda akan melihat bahwa itu melanggar setidaknya satu dari masalah umum ini.
Hadapi Itu, Kriptografi sulit.
Biarkan untuk para ahli. Biarkan untuk orang-orang yang tugasnya memelihara perpustakaan-perpustakaan ini. Jika Anda perlu mengambil keputusan, Anda salah melakukannya.
Sebagai gantinya, cukup gunakan perpustakaan. Ada beberapa tergantung pada kebutuhan Anda.
Perpustakaan
Berikut ini adalah rincian dari beberapa API yang lebih umum.
PHP 5.5 API - (Tersedia untuk 5.3.7+)
Mulai di PHP 5.5, API baru untuk hashing passwords sedang diperkenalkan. Ada juga perpustakaan kompatibilitas shim yang dikelola (oleh saya) untuk 5.3.7+. Ini memiliki manfaat menjadi peer-review dan implementasi yang mudah digunakan.
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
Sungguh, ini ditujukan untuk menjadi sangat sederhana.
Sumber:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Ini adalah API lain yang mirip dengan PHP 5.5 satu, dan melakukan tujuan yang sama.
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
Sumber:
PasswordLib
Ini adalah pendekatan yang sedikit berbeda untuk hashing kata sandi. Daripada hanya mendukung bcrypt, PasswordLib mendukung sejumlah besar algoritma hashing. Ini terutama berguna dalam konteks di mana Anda perlu mendukung kompatibilitas dengan sistem lama dan berbeda yang mungkin berada di luar kendali Anda. Ini mendukung sejumlah besar algoritma hashing. Dan didukung 5.3.2+
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
Referensi:
- Kode Sumber / Dokumentasi: GitHub
PHPASS
Ini adalah lapisan yang mendukung bcrypt, tetapi juga mendukung algoritma yang cukup kuat yang berguna jika Anda tidak memiliki akses ke PHP> = 5.3.2 ... Ini sebenarnya mendukung PHP 3.0+ (walaupun tidak dengan bcrypt).
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
Sumber daya
Catatan: Jangan gunakan alternatif PHPASS yang tidak di-host di openwall, itu adalah proyek yang berbeda !!!
Tentang BCrypt
Jika Anda perhatikan, setiap perpustakaan ini mengembalikan satu string. Itu karena cara BCrypt bekerja secara internal. Dan ada banyak jawaban tentang hal itu. Berikut adalah pilihan yang saya tulis, yang tidak akan saya salin / tempel di sini, tetapi tautkan ke:
Bungkus
Ada banyak pilihan berbeda. Yang Anda pilih terserah Anda. Namun, saya akan SANGAT menyarankan agar Anda menggunakan salah satu perpustakaan di atas untuk menangani ini untuk Anda.
Sekali lagi, jika Anda menggunakan crypt()
secara langsung, Anda mungkin melakukan sesuatu yang salah. Jika kode Anda menggunakan hash()
(atau md5()
atau sha1()
) secara langsung, Anda hampir pasti melakukan sesuatu yang salah.
Cukup gunakan perpustakaan ...