× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Password Hashing trong PHP - Chi tiết từ A-Z

15/06/2023 01:27

Mọi người đều xây dựng một ứng dụng PHP dựa trên thông tin đăng nhập của người dùng. Tên người dùng và mật khẩu được lưu trữ trong cơ sở dữ liệu và sau đó được sử dụng để xác thực người dùng khi đăng nhập.

Mọi người đều xây dựng một ứng dụng PHP dựa trên thông tin đăng nhập của người dùng. Tên người dùng và mật khẩu được lưu trữ trong cơ sở dữ liệu và sau đó được sử dụng để xác thực người dùng khi đăng nhập.

Điều quan trọng là bạn phải hash mật khẩu đúng cách trước khi lưu trữ chúng. hash và mã hóa là hai thứ rất khác nhau thường bị nhầm lẫn.

hash là một chức năng một chiều không thể đảo ngược. Điều này tạo ra một chuỗi có độ dài cố định không thể đảo ngược một cách khả thi. Điều này có nghĩa là bạn có thể so sánh một hàm hash với một hàm hash khác để xác định xem chúng có đến từ cùng một chuỗi nguồn hay không, nhưng bạn không thể xác định chuỗi gốc. Nếu mật khẩu không được hash và cơ sở dữ liệu của bạn bị bên thứ ba truy cập trái phép, tất cả tài khoản người dùng hiện đã bị xâm phạm.

Không giống như hash, mã hóa có thể đảo ngược (miễn là bạn có khóa). Mã hóa hữu ích trong các lĩnh vực khác, nhưng lại là một chiến lược tồi để lưu trữ mật khẩu một cách an toàn.

Mật khẩu cũng phải được thêm sallted riêng bằng cách thêm một chuỗi ngẫu nhiên vào mỗi mật khẩu trước khi hash. Điều này ngăn chặn các cuộc tấn công từ điển và việc sử dụng “bảng cầu vồng” (một danh sách đảo ngược các hàm hash mật mã cho các mật khẩu phổ biến.)

hash và tạo sallted rất quan trọng vì người dùng thường sử dụng cùng một mật khẩu cho nhiều dịch vụ và chất lượng mật khẩu có thể kém.

Ngoài ra, bạn nên sử dụng thuật toán hash mật khẩu chuyên dụng thay vì hàm hash mật mã có mục đích chung, nhanh (ví dụ: SHA256). Danh sách ngắn các thuật toán hash mật khẩu được chấp nhận (kể từ tháng 6 năm 2018) để sử dụng là:

  • Argon2 (có sẵn trong PHP 7.2 trở lên)
  • mã hóa
  • Bcrypt (PHP cung cấp cái này cho bạn; xem bên dưới)
  • PBKDF2 với HMAC-SHA256 hoặc HMAC-SHA512

May mắn thay, ngày nay PHP làm cho điều này trở nên dễ dàng.

>>> ĐỌc thêm: Chuỗi PHP - Các ví dụ thực tế cho người mới tìm hiểu

hash mật khẩu vớipassword_hash

Trong PHP 5.5 password_hash()đã được giới thiệu. Tại thời điểm này, nó đang sử dụng BCrypt, thuật toán mạnh nhất hiện được hỗ trợ bởi PHP. Nó sẽ được cập nhật trong tương lai để hỗ trợ nhiều thuật toán hơn khi cần thiết. Thư password_compat viện được tạo để cung cấp khả năng tương thích chuyển tiếp cho PHP >= 5.3.7.

Dưới đây, chúng tôi hash một chuỗi, sau đó kiểm tra hàm hash đối với một chuỗi mới. Bởi vì hai chuỗi nguồn của chúng tôi khác nhau ('mật khẩu bí mật' so với 'mật khẩu xấu'), đăng nhập này sẽ không thành công.

<?php
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // Correct Password
} else {
    // Wrong password
}

password_hash()chăm sóc sallted mật khẩu cho bạn. sallted được lưu trữ, cùng với thuật toán và “chi phí”, như một phần của hàm hash. password_verify()trích xuất phần này để xác định cách kiểm tra mật khẩu, vì vậy bạn không cần một trường cơ sở dữ liệu riêng để lưu trữ sallted của mình.