Cách dễ nhất để bảo mật lược đồ lưu trữ mật khẩu của bạn là sử dụng thư viện chuẩn .
Bởi vì bảo mật có xu hướng phức tạp hơn rất nhiều và với nhiều khả năng vô hình hơn so với hầu hết các lập trình viên có thể giải quyết một mình, sử dụng một thư viện tiêu chuẩn hầu như luôn luôn dễ dàng và an toàn nhất (nếu không phải là duy nhất).
API mật khẩu PHP mới (5.5.0+)
Nếu bạn đang sử dụng phiên bản PHP 5.5.0 trở lên, bạn có thể sử dụng API băm mật khẩu đơn giản hóa mới
Ví dụ về mã sử dụng API mật khẩu của PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Trong trường hợp bạn vẫn đang sử dụng kế thừa 5.3.7 hoặc mới hơn, bạn có thể cài đặt ircmaxell / password_compat để có quyền truy cập vào các chức năng tích hợp)
Cải thiện khi băm muối: thêm hạt tiêu
Nếu bạn muốn bảo mật thêm, những người bảo mật hiện nay (2017) khuyên bạn nên thêm một ' tiêu ' vào băm mật khẩu muối (tự động).
Có một cách đơn giản, thả trong lớp thực hiện mô hình này một cách an toàn, tôi khuyên bạn nên:
Netsilik / PepperedPasswords
( github ).
Nó đi kèm với Giấy phép MIT, vì vậy bạn có thể sử dụng nó theo cách bạn muốn, ngay cả trong các dự án độc quyền.
Ví dụ về mã sử dụng Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
Thư viện chuẩn OLD
Xin lưu ý: bạn không cần phải điều này nữa! Điều này chỉ ở đây cho mục đích lịch sử.
Hãy xem: Khung băm mật khẩu PHP di động : phpass và đảm bảo bạn sử dụng CRYPT_BLOWFISH
thuật toán nếu có thể.
Ví dụ về mã sử dụng phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass đã được triển khai trong một số dự án khá nổi tiếng:
- phpBB3
- WordPress 2.5+ cũng như bbPress
- bản phát hành Drupal 7, (mô-đun có sẵn cho Drupal 5 & 6)
- khác
Điều tốt là bạn không cần phải lo lắng về các chi tiết, những chi tiết đó đã được lập trình bởi những người có kinh nghiệm và được xem xét bởi nhiều người trên internet.
Để biết thêm thông tin về các lược đồ lưu trữ mật khẩu, hãy đọc bài đăng trên blog của Jeff : Có thể bạn đang lưu trữ mật khẩu không chính xác
Bất cứ điều gì bạn làm nếu bạn đi theo cách tiếp cận ' Tôi sẽ tự làm, cảm ơn bạn , không sử dụng MD5
hoặc không sử dụng SHA1
nữa . Chúng là thuật toán băm đẹp, nhưng được coi là bị hỏng vì mục đích bảo mật .
Hiện nay, sử dụng hầm mộ , với CRYPT_BLOWFISH là thực hành tốt nhất.
CRYPT_BLOWFISH trong PHP là một triển khai băm Bcrypt. Bcrypt dựa trên mật mã khối Blowfish, sử dụng thiết lập khóa đắt tiền của nó để làm chậm thuật toán.