md5/sha1 là hàm băm nhanh và không có salt → dễ brute-force bằng GPU và tra rainbow table. password_hash() dùng thuật toán chậm có chủ đích (mặc định bcrypt, hoặc Argon2) với salt ngẫu nhiên nhúng sẵn trong chuỗi kết quả, nên không cần cột salt riêng.
php
$hash = password_hash($plain, PASSWORD_DEFAULT); // salt tự sinh + cost nhúng trong chuỗi
// lưu $hash vào DB — cột nên rộng 255 ký tự
if (password_verify($plain, $hash)) { /* đăng nhập hợp lệ */ }
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$hash = password_hash($plain, PASSWORD_DEFAULT); // rehash khi tăng cost
}- cost (mặc định 10 với bcrypt) điều chỉnh độ chậm → tăng theo phần cứng để chống brute-force.
password_verify()so sánh constant-time, chống timing attack — đừng tự so sánh bằng==.- Không bao giờ lưu plaintext hay hàm băm nhanh; luôn để
PASSWORD_DEFAULT(theo chuẩn mới nhất của PHP).