Vì vậy, bạn muốn sử dụng bcrypt? Tuyệt vời! Tuy nhiên, giống như các lĩnh vực khác của mật mã, bạn không nên tự mình làm điều đó. Nếu bạn cần lo lắng về bất cứ điều gì như quản lý khóa, hoặc lưu trữ muối hoặc tạo số ngẫu nhiên, bạn đã làm sai.
Lý do rất đơn giản: thật dễ dàng để làm hỏng bcrypt . Trên thực tế, nếu bạn nhìn vào hầu hết mọi đoạn mã trên trang này, bạn sẽ nhận thấy rằng nó vi phạm ít nhất một trong những vấn đề phổ biến này.
Đối mặt với nó, Mật mã là khó.
Để lại cho các chuyên gia. Để lại nó cho những người có nhiệm vụ duy trì các thư viện này. Nếu bạn cần đưa ra quyết định, bạn đang làm sai.
Thay vào đó, chỉ cần sử dụng một thư viện. Một số tồn tại tùy thuộc vào yêu cầu của bạn.
Thư viện
Dưới đây là bảng phân tích một số API phổ biến hơn.
API PHP 5.5 - (Có sẵn cho 5.3.7+)
Bắt đầu từ PHP 5.5, một API mới để băm mật khẩu đang được giới thiệu. Ngoài ra còn có một thư viện tương thích shim được duy trì (bởi tôi) cho 5.3.7+. Điều này có lợi ích là việc thực hiện đánh giá ngang hàng và đơn giản để sử dụng.
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
}
}
Thực sự, nó nhằm mục đích cực kỳ đơn giản.
Tài nguyên:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Đây là một API khác tương tự như PHP 5.5 và có mục đích tương tự.
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
}
}
Tài nguyên:
Mật khẩu
Đây là một cách tiếp cận hơi khác nhau để băm mật khẩu. Thay vì chỉ đơn giản là hỗ trợ bcrypt, PasswordLib hỗ trợ một số lượng lớn thuật toán băm. Nó chủ yếu hữu ích trong các bối cảnh mà bạn cần hỗ trợ khả năng tương thích với các hệ thống cũ và khác biệt có thể nằm ngoài tầm kiểm soát của bạn. Nó hỗ trợ một số lượng lớn các thuật toán băm. Và được hỗ trợ 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
}
}
Người giới thiệu:
PHPASS
Đây là lớp hỗ trợ bcrypt, nhưng cũng hỗ trợ thuật toán khá mạnh, hữu ích nếu bạn không có quyền truy cập vào PHP> = 5.3.2 ... Nó thực sự hỗ trợ PHP 3.0+ (mặc dù không phải với 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
}
}
Tài nguyên
Lưu ý: Không sử dụng các lựa chọn thay thế PHPASS không được lưu trữ trên openwall, chúng là các dự án khác nhau !!!
Giới thiệu về BCrypt
Nếu bạn nhận thấy, mỗi một trong những thư viện này trả về một chuỗi. Đó là vì cách BCrypt hoạt động nội bộ. Và có một TON câu trả lời về điều đó. Đây là một lựa chọn mà tôi đã viết, tôi sẽ không sao chép / dán ở đây, nhưng liên kết đến:
Gói (lại
Có nhiều sự lựa chọn khác nhau. Mà bạn chọn là tùy thuộc vào bạn. Tuy nhiên, tôi sẽ RẤT khuyên bạn nên sử dụng một trong các thư viện trên để xử lý việc này cho bạn.
Một lần nữa, nếu bạn đang sử dụng crypt()
trực tiếp, có lẽ bạn đang làm sai điều gì đó. Nếu mã của bạn đang sử dụng hash()
(hoặc md5()
hoặc sha1()
) trực tiếp, bạn gần như chắc chắn đã làm gì đó sai.
Chỉ cần sử dụng một thư viện ...