ดังนั้นคุณต้องการใช้ bcrypt หรือไม่ ! น่ากลัว อย่างไรก็ตามเช่นเดียวกับด้านอื่น ๆ ของการเข้ารหัสคุณไม่ควรทำเอง หากคุณจำเป็นต้องกังวลเกี่ยวกับสิ่งต่าง ๆ เช่นการจัดการคีย์หรือการจัดเก็บเกลือหรือสร้างตัวเลขสุ่มแสดงว่าคุณทำผิด
เหตุผลง่าย: มันจึงง่ายนิดที่จะกรูขึ้น bcrypt ในความเป็นจริงหากคุณดูโค้ดเกือบทุกชิ้นในหน้านี้คุณจะสังเกตเห็นว่ามันละเมิดปัญหาทั่วไปอย่างน้อยหนึ่งปัญหา
เผชิญหน้ากับมันการเข้ารหัสยาก
ทิ้งไว้ให้ผู้เชี่ยวชาญ ปล่อยไว้สำหรับคนที่มีหน้าที่ดูแลห้องสมุดเหล่านี้ หากคุณต้องการตัดสินใจคุณกำลังทำผิด
ให้ใช้ไลบรารีแทน มีอยู่หลายอย่างขึ้นอยู่กับความต้องการของคุณ
ห้องสมุด
นี่คือรายละเอียดของ API ทั่วไปบางส่วน
PHP 5.5 API - (ใช้ได้สำหรับ 5.3.7+)
เริ่มต้นใน PHP 5.5 จะมีการแนะนำ API ใหม่สำหรับรหัสผ่านการแฮช นอกจากนี้ยังมีไลบรารีความเข้ากันได้แบบชิม (โดยฉัน) สำหรับ 5.3.7+ นี้มีประโยชน์ในการเป็น peer-reviewed และง่ายในการดำเนินการใช้งาน
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
}
}
จริงๆแล้วมันมีจุดประสงค์เพื่อให้ง่ายมาก
แหล่งข้อมูล:
Zend \ Crypt \ รหัสผ่าน \ Bcrypt (5.3.2+)
นี่เป็นอีก API ที่คล้ายกับ PHP 5.5 และทำหน้าที่คล้ายกัน
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
}
}
แหล่งข้อมูล:
PasswordLib
นี่เป็นวิธีที่แตกต่างกันเล็กน้อยในการแฮชรหัสผ่าน PasswordLib รองรับอัลกอริธึมการแฮชจำนวนมากแทนที่จะสนับสนุน bcrypt เพียงอย่างเดียว ส่วนใหญ่จะเป็นประโยชน์ในบริบทที่คุณต้องการสนับสนุนความเข้ากันได้กับระบบเดิมและระบบที่แตกต่างกันซึ่งอาจอยู่นอกเหนือการควบคุมของคุณ สนับสนุนอัลกอริทึมการแปลงแป้นพิมพ์จำนวนมาก และได้รับการสนับสนุน 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
}
}
อ้างอิง:
- รหัสที่มา / เอกสารประกอบ: GitHub
phpass
นี่คือเลเยอร์ที่รองรับ bcrypt แต่ก็รองรับอัลกอริธึมที่ค่อนข้างแรงซึ่งมีประโยชน์ถ้าคุณไม่สามารถเข้าถึง PHP> = 5.3.2 ... จริง ๆ แล้วรองรับ PHP 3.0+ (แม้ว่าจะไม่ใช่ 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
}
}
ทรัพยากร
หมายเหตุ:อย่าใช้ทางเลือก PHPASS ที่ไม่ได้โฮสต์บน openwall พวกเขาเป็นโครงการที่แตกต่าง !!!
เกี่ยวกับ BCrypt
หากคุณสังเกตเห็นไลบรารีเหล่านี้ทุกตัวจะคืนค่าสตริง นั่นเป็นเพราะวิธีการทำงานของ BCrypt ภายใน และมีคำตอบมากมายเกี่ยวกับเรื่องนั้น นี่คือตัวเลือกที่ฉันเขียนว่าฉันจะไม่คัดลอก / วางที่นี่ แต่ลิงก์ไปที่:
สรุป
มีตัวเลือกที่แตกต่างกันมากมาย สิ่งที่คุณเลือกนั้นขึ้นอยู่กับคุณ อย่างไรก็ตามฉันขอแนะนำให้คุณใช้หนึ่งในห้องสมุดด้านบนเพื่อจัดการสิ่งนี้ให้คุณ
ถ้าคุณใช้crypt()
โดยตรงคุณอาจทำผิดพลาด หากรหัสของคุณใช้hash()
(หรือmd5()
หรือsha1()
) โดยตรงคุณเกือบทำอะไรผิดพลาด
แค่ใช้ห้องสมุด ...