PHP 8.5.7密码加密应使用password_hash()配合PASSWORD_ARGON2ID(推荐)或PASSWORD_BCRYPT,配合password_verify()验证;敏感数据加解密优先AES-256-GCM;密钥交换用Ed25519或RSA-3072+;禁用md5/sha1等不安全算法。

密码存储:用 password_hash() 选对算法
PHP 8.5.7 的 password_hash() 支持两种主力算法:
-
PASSWORD_ARGON2ID:NIST 推荐标准,抗 GPU/ASIC 暴力破解能力强。需系统支持 libsodium(PHP 默认已启用),推荐参数:
['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 2] -
PASSWORD_BCRYPT:兼容性更广,成本因子(cost)建议设为 12–14(如
['cost' => 12])。若 Argon2 不可用,它是可靠 fallback。
⚠️ 注意:PASSWORD_DEFAULT 当前仍指向 bcrypt(非 Argon2),但未来可能切换——生产环境建议显式指定算法,避免升级后行为突变。
敏感数据加解密:优先用 OpenSSL + AES-GCM
PHP 8.5.7 完整支持 OpenSSL 3.x,推荐使用带认证的 AEAD 模式:
-
AES-256-GCM:机密性 + 完整性 + 认证一体化,无须额外 HMAC。调用
openssl_encrypt($data, 'aes-256-gcm', $key, 0, $iv, $tag, $aad) -
AES-128-CBC / AES-256-CBC:仍可用,但必须手动添加 HMAC 验证(如
hash_hmac('sha256', $ciphertext, $key)),否则易受填充预言攻击。 - 密钥和 IV 必须每次随机生成:
$key = random_bytes(32)(AES-256),$iv = openssl_random_pseudo_bytes(16)(GCM 或 CBC 均需)
密钥交换与签名:RSA 与 Ed25519 并存
OpenSSL 3.x 在 PHP 8.5.7 中默认启用现代密钥类型:
立即学习“PHP免费学习笔记(深入)”;
-
RSA:支持 2048 位及以上(
OPENSSL_KEYTYPE_RSA),用于传统签名或密钥封装;但密钥长度 ≥3072 位才满足当前 NIST 建议。 -
Ed25519:Sodium 扩展原生支持,速度快、签名短、无需随机数生成器,适合 JWT 签名或 API 请求验签:
sodium_crypto_sign_keypair() - 不推荐使用 DSA 或弱 RSA(如 1024 位);PHP 8.5.7 已禁用 SSLv2/v3,TLS 1.0/1.1 默认关闭。
哈希与编码:弃用旧算法,用 hash() 统一接口
单向哈希应避免直接调用 md5() 或 sha1():
- 校验完整性或派生密钥:用
hash('sha256', $data)或更安全的hash('sha3-512', $data)(PHP 8.1+ 支持) - 不可用于密码——那是
password_hash()的职责;也不可用于密钥派生(应改用hash_pbkdf2()或sodium_crypto_pwhash()) -
base64_encode()仅是编码,不是加密;传输前若需混淆,应先加密再 base64。
安全配置关键项(php.ini 与运行时)
仅启用算法不够,还需加固环境:
- 确保
extension=openssl和extension=sodium在 php.ini 中启用(PHP 8.5.7 默认开启) - 禁用不安全函数:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,dl,curl_exec,curl_multi_exec(尤其在 Web 环境) - 设置
openssl.cafile=/path/to/trusted-certs.pem,避免证书验证绕过 - 密钥绝不硬编码:从
$_ENV、getenv()或config/secrets.php(.gitignore + 文件权限 600)读取



















