string crypt(string $input_string [, string $salt])
$1$ 12字符)、Blowfish ($2a$ 16字符)、SHA-256/512 ($5$/$6$)。CRYPT_SALT_LENGTH, CRYPT_MD5, CRYPT_BLOWFISH 等常量。crypt(),比較結果。$hash = password_hash("mypassword", PASSWORD_DEFAULT); // 自動選擇最強算法 (bcrypt/argon2)、生成鹽值
if (password_verify("user_input", $hash)) { /* 成功 */ }
// 算法升級檢查
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$newHash = password_hash("user_input", PASSWORD_DEFAULT); // 更新存儲
}
**優勢**:自動處理鹽值、算法標識、成本因子,防止時序攻擊,未來兼容。
openssl_encrypt()/decrypt() 支持 AES, ChaCha20 等;openssl_pkey_new() 生成 RSA/ECC 密鑰對。<?php
// 註冊/修改密碼
$hash = password_hash($_POST['password'], PASSWORD_ARGON2ID); // PHP 7.2+ 推薦 Argon2id
// 存入數據庫: $hash (包含算法、成本、鹽值)
// 登錄驗證
$stmt = $pdo->prepare("SELECT password_hash FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
$row = $stmt->fetch();
if ($row && password_verify($_POST['password'], $row['password_hash'])) {
// 登錄成功
if (password_needs_rehash($row['password_hash'], PASSWORD_ARGON2ID)) {
// 重新哈希並更新數據庫
}
}
?>
crypt($pass, substr($pass,0,2)) 等自創方案極不安全。hash_equals() (PHP 5.6+),password_verify 內部已處理。現代 PHP 開發:**密碼存儲只用 password_hash()/password_verify()**;數據加密傳輸/存儲用 openssl_encrypt() (AES-GCM/ChaCha20-Poly1305) 並妥善管理密鑰 (環境變量、KMS、HSM);簽名驗證用 hash_hmac() 或非對稱簽名。