Từ RFC 3174 - Thuật toán băm an toàn của Hoa Kỳ 1. "SHA-1 tạo đầu ra 160 bit được gọi là thông báo tóm tắt. Sau đó, thông báo tóm tắt có thể, ví dụ, là đầu vào cho một thuật toán chữ ký để tạo hoặc xác minh chữ ký cho thông báo. Việc ký vào thông báo tóm tắt thay vì thông báo thường cải thiện hiệu quả của quy trình vì thông báo tóm tắt thường có kích thước nhỏ hơn nhiều so với thông báo. Thuật toán băm tương tự phải được sử dụng bởi người xác minh chữ ký số như đã được sử dụng bởi người tạo chữ ký số. "
Mặt tiền
$hashed = Hash::make['password', [
2 của Laravel cung cấp hàm băm Bcrypt và Argon2 an toàn để lưu trữ mật khẩu người dùng. Nếu bạn đang sử dụng một trong các bộ khởi động ứng dụng Laravel, Bcrypt sẽ được sử dụng để đăng ký và xác thực theo mặc địnhBcrypt là một lựa chọn tuyệt vời để băm mật khẩu vì "hệ số công việc" của nó có thể điều chỉnh được, điều đó có nghĩa là thời gian cần để tạo hàm băm có thể tăng lên khi sức mạnh phần cứng tăng lên. Khi băm mật khẩu, chậm là tốt. Thuật toán băm mật khẩu càng mất nhiều thời gian thì người dùng độc hại càng mất nhiều thời gian để tạo "bảng cầu vồng" của tất cả các giá trị băm chuỗi có thể có thể được sử dụng trong các cuộc tấn công vũ phu chống lại các ứng dụng
Cấu hình
Trình điều khiển băm mặc định cho ứng dụng của bạn được định cấu hình trong tệp cấu hình
$hashed = Hash::make['password', [
3 của ứng dụng. Hiện tại có một số trình điều khiển được hỗ trợ. Bcrypt và Argon2 [các biến thể Argon2i và Argon2id]Sử dụng cơ bản
Băm mật khẩu
Bạn có thể băm mật khẩu bằng cách gọi phương thức
$hashed = Hash::make['password', [
4 trên mặt tiền $hashed = Hash::make['password', [
2namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
* Update the password for the user.
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
public function update[Request $request]
// Validate the new password length...
'password' => Hash::make[$request->newPassword]
Điều chỉnh hệ số công việc Bcrypt
Nếu bạn đang sử dụng thuật toán Bcrypt, phương thức
$hashed = Hash::make['password', [
4 cho phép bạn quản lý hệ số công việc của thuật toán bằng tùy chọn $hashed = Hash::make['password', [
0; $hashed = Hash::make['password', [
Điều chỉnh hệ số làm việc Argon2
Nếu bạn đang sử dụng thuật toán Argon2, phương pháp
$hashed = Hash::make['password', [
4 cho phép bạn quản lý hệ số công việc của thuật toán bằng cách sử dụng các tùy chọn $hashed = Hash::make['password', [
2, $hashed = Hash::make['password', [
3 và $hashed = Hash::make['password', [
4; $hashed = Hash::make['password', [
Lưu ý
Để biết thêm thông tin về các tùy chọn này, vui lòng tham khảo tài liệu PHP chính thức về hàm băm Argon.
Xác minh rằng mật khẩu khớp với hàm băm
Phương thức
$hashed = Hash::make['password', [
5 được cung cấp bởi mặt tiền $hashed = Hash::make['password', [
2 cho phép bạn xác minh rằng một chuỗi văn bản thuần đã cho tương ứng với một hàm băm đã cho________số 8Xác định xem mật khẩu có cần được băm lại không
Phương pháp
$hashed = Hash::make['password', [
7 được cung cấp bởi mặt tiền $hashed = Hash::make['password', [
2 cho phép bạn xác định xem hệ số công việc mà trình băm sử dụng có thay đổi kể từ khi mật khẩu được băm hay không. Một số ứng dụng chọn thực hiện kiểm tra này trong quá trình xác thực của ứng dụng Đây là mã SQL để tạo bảng [bạn có thể sử dụng nó với PhpMyAdmin để tạo bảng trên môi trường phát triển của mình]
$hashed = Hash::make['password', [
0Quan trọng
Đảm bảo đặt cột mật khẩu dưới dạng varchar .
[Một varchar là một cột văn bản có độ dài thay đổi. ]
Lý do là kích thước của hàm băm từ password_hash[] có thể thay đổi [sẽ biết thêm chi tiết về vấn đề này sau]
Nếu bạn cần trợ giúp về SQL, bạn có thể tìm thấy tất cả những gì bạn cần tại đây. Cách sử dụng PHP với MySQL
Bây giờ, bạn cần kết nối với cơ sở dữ liệu từ tập lệnh PHP của mình
Nếu bạn không biết cách, đây là tập lệnh kết nối PDO đơn giản mà bạn có thể sử dụng ngay
Chỉ cần chỉnh sửa các tham số kết nối để làm cho nó hoạt động với môi trường của riêng bạn
$hashed = Hash::make['password', [
1
Bây giờ bạn đã sẵn sàng để thêm người dùng mới vào bảng
Đây là một ví dụ đầy đủ [pdo. php là tập lệnh chứa đoạn kết nối cơ sở dữ liệu trước đó]
$hashed = Hash::make['password', [
2Quan trọng. Trong ví dụ này, chúng tôi đã bỏ qua các bước xác thực, bao gồm
- kiểm tra độ dài tên người dùng và mật khẩu
- kiểm tra các ký tự không hợp lệ
- kiểm tra xem tên người dùng đã tồn tại chưa
Cách thay đổi mật khẩu của người dùng
Ví dụ tiếp theo cho thấy cách thay đổi mật khẩu của người dùng hiện có
Đầu tiên, lấy mật khẩu mới và tạo hàm băm của nó bằng password_hash[]
$hashed = Hash::make['password', [
3Sau đó, cập nhật hàng trong bảng có cùng ID tài khoản của người dùng hiện tại và đặt hàm băm mới
Ghi chú. chúng tôi cho rằng biến $accountId chứa ID tài khoản
$hashed = Hash::make['password', [
4Cách sử dụng password_verify[]
Để xác minh mật khẩu do người dùng từ xa cung cấp, bạn cần sử dụng hàm password_verify[]
password_verify[] nhận hai đối số
- mật khẩu bạn cần xác minh, làm đối số đầu tiên
- hàm băm từ password_hash[] của mật khẩu ban đầu, làm đối số thứ hai
Nếu mật khẩu đúng, password_verify[] trả về true
Đây là một ví dụ
$hashed = Hash::make['password', [
5
Quan trọng
Bạn không thể chỉ so sánh hai giá trị băm khác nhau để xem chúng có khớp không
Lý do là password_hash[] tạo ra các giá trị băm muối
Băm muối bao gồm một chuỗi ngẫu nhiên, được đặt tên là muối muối, như một biện pháp bảo vệ chống lại các cuộc tấn công từ điển và bảng cầu vồng
Do đó, mọi hàm băm sẽ khác nhau ngay cả khi mật khẩu nguồn giống nhau
Hãy thử đoạn mã sau. Bạn sẽ thấy rằng hai giá trị băm khác nhau, ngay cả khi mật khẩu giống nhau
$hashed = Hash::make['password', [
6
Ghi chú
password_verify[] chỉ hoạt động với các giá trị băm được tạo bởi password_hash[]
Bạn không thể sử dụng nó để kiểm tra mật khẩu đối với hàm băm MD5 hoặc SHA
Cách tăng bảo mật băm
Băm được tạo bởi password_hash[] rất an toàn
Nhưng bạn có thể làm cho nó mạnh hơn nữa bằng hai kỹ thuật đơn giản
- Tăng chi phí Bcrypt
- Tự động cập nhật thuật toán băm
chi phí Bcrypt
Bcrypt là thuật toán băm mặc định hiện tại được sử dụng bởi password_hash[]
Thuật toán này nhận một tham số tùy chọn có tên là “chi phí”. Giá trị chi phí mặc định là 10
Bằng cách tăng chi phí, bạn có thể làm cho hàm băm khó tính toán hơn. Chi phí càng cao, thời gian cần thiết để tạo hàm băm càng lâu
Chi phí cao hơn khiến việc phá vỡ hàm băm trở nên khó khăn hơn. Tuy nhiên, nó cũng làm cho quá trình tạo băm và kiểm tra lâu hơn
Vì vậy, bạn muốn tìm một sự thỏa hiệp giữa bảo mật và tải máy chủ
Đây là cách bạn có thể đặt giá trị chi phí tùy chỉnh cho password_hash[]
$hashed = Hash::make['password', [
7
Nhưng bạn nên đặt giá trị chi phí nào?
Một thỏa hiệp tốt là giá trị chi phí cho phép máy chủ của bạn tạo hàm băm trong khoảng 100 mili giây
Đây là một thử nghiệm đơn giản để tìm giá trị này
$hashed = Hash::make['password', [
80Khi bạn đã tìm thấy chi phí của mình, bạn có thể sử dụng nó mỗi khi bạn thực thi password_hash[] như trong ví dụ trước
Luôn cập nhật giá trị băm của bạn với password_needs_rehash[]
Để hiểu bước này, hãy xem cách password_hash[] hoạt động
password_hash[] nhận ba đối số
- Mật khẩu bạn cần băm
- Thuật toán băm bạn muốn sử dụng
- Một loạt các tùy chọn để chuyển đến thuật toán băm
PHP hỗ trợ các thuật toán băm khác nhau, nhưng bạn thường muốn sử dụng thuật toán băm mặc định
Bạn có thể chọn thuật toán mặc định bằng cách sử dụng hằng số PASSWORD_DEFAULT, như bạn đã thấy trong các ví dụ trước
Kể từ tháng 6 năm 2020, thuật toán mặc định là Bcrypt
Tuy nhiên, PHP có thể thay đổi thuật toán mặc định trong tương lai, nếu một thuật toán tốt hơn và an toàn hơn được triển khai
Khi điều đó xảy ra, hằng PASSWORD_DEFAULT sẽ trỏ đến thuật toán mới. Vì vậy, tất cả các giá trị băm mới sẽ được tạo bằng thuật toán mới
Nhưng điều gì sẽ xảy ra nếu bạn muốn lấy tất cả các giá trị băm cũ của mình, được tạo bằng thuật toán trước đó và tự động tạo lại chúng bằng thuật toán mới?
Đây là lúc password_needs_rehash[] phát huy tác dụng
Hàm này kiểm tra xem một hàm băm đã được tạo bằng một thuật toán và tham số nhất định chưa
Ví dụ
$hashed = Hash::make['password', [
81Nếu thuật toán băm mặc định hiện tại khác với thuật toán dùng để tạo hàm băm, password_needs_rehash[] sẽ trả về true
password_needs_rehash[] cũng kiểm tra xem thông số tùy chọn có khác không
Điều này rất hữu ích nếu bạn muốn cập nhật giá trị băm của mình sau khi thay đổi một tham số như chi phí Bcrypt
Ví dụ này cho thấy cách bạn có thể tự động kiểm tra hàm băm mật khẩu và cập nhật nó nếu cần, khi người dùng từ xa đăng nhập
$hashed = Hash::make['password', [
82Cách tự động chuyển đổi các giá trị băm cũ
Trong ví dụ này, bạn sẽ triển khai một tập lệnh đơn giản để tự động chuyển đổi các giá trị băm cũ, dựa trên MD5 thành các giá trị băm an toàn được tạo bằng password_hash[]
Đây là cách nó hoạt động
- Khi người dùng đăng nhập, trước tiên bạn kiểm tra mật khẩu của họ bằng password_verify[]
- Nếu đăng nhập không thành công, hãy kiểm tra xem hàm băm trong cơ sở dữ liệu có phải là hàm băm MD5 không nếu mật khẩu
- Nếu đúng như vậy, thì bạn cập nhật hàm băm bằng hàm được tạo bởi password_hash[]
Đây là kịch bản
$hashed = Hash::make['password', [
83Phần kết luận
Trong hướng dẫn này, bạn đã học cách sử dụng password_hash[] và password_verify[] để tạo các giá trị băm an toàn cho mật khẩu của mình [và tại sao bạn không nên sử dụng MD5]
Bạn cũng đã học cách làm cho mật khẩu của mình được băm an toàn hơn bằng cách đặt chi phí Bcrypt phù hợp và tự động băm lại mật khẩu của bạn khi cần