本文目录导读:

在 PHP 7.4 到 PHP 8.x 的演进中,哈希算法(Hash Algorithms)主要新增了以下几类新选择或重要改进,尤其是在 信息摘要、密码哈希 和 密钥哈希 三个层面:
信息摘要(普通哈希)的新算法
PHP 8.1 开始引入 MurmurHash3 和 xxHash 系列,这些算法重点优化 速度 而非密码学安全性,适合做哈希表、数据分片或文件校验。
| 算法 | 引入版本 | 特点 |
|---|---|---|
murmur3a (32-bit) |
PHP 8.1+ | 非加密哈希,极快,适合分散性要求高的场景(如哈希表、Bloom Filter) |
murmur3c (128-bit x86) |
PHP 8.1+ | MurmurHash3 的 128 位变体,速度比 MD5 快 3-4 倍 |
murmur3f (128-bit x64) |
PHP 8.1+ | 针对 64 位架构优化的 128 位版本 |
xxh32 |
PHP 8.1+ | xxHash 32 位,比 CRC32 快,但冲突率更低 |
xxh64 |
PHP 8.1+ | 64 位 xxHash,适合大文件或文本块快速摘要 |
xxh3 |
PHP 8.1+ | 最新一代 xxHash,速度是所有非加密哈希中最快的之一 |
xxh128 |
PHP 8.1+ | 128 位 xxHash,兼具速度和低碰撞率 |
使用方式:通过 hash() 或 hash_algos() 检查可用算法。
// PHP 8.1+ 可用
echo hash('xxh64', 'hello'); // 输出类似 "8c3e7c7b51e6f6a5"
密码哈希(安全哈希)的新选择
PHP 8.0 和 8.4 对密码哈希扩展做了重要更新,这是最值得注意的安全改进:
| 算法/常量 | 引入版本 | 说明 |
|---|---|---|
PASSWORD_ARGON2ID |
PHP 7.3(实际生产推广在 8.x) | 推荐使用的 Argon2 变体,抗侧信道攻击强于 Argon2i |
PASSWORD_BCRYPT 增加 cost上限提升 |
PHP 8.0 | 允许 cost 参数从 4~31 扩展到 4~32(更安全但更慢) |
| Sodium(libsodium)密码哈希 | PHP 7.2 集成,0+ 成为核心扩展 | sodium_crypto_pwhash_str() 使用 Argon2id,比 password_hash() 更灵活 |
| PHP 8.4(未发布预期) | 可能引入 新的 password_hash 选项或算法,目前可关注 RFC。 | 社区讨论过是否将 Argon2 设为默认 |
推荐做法(自 PHP 8.0 起):
// 自动使用最安全的默认算法(目前是 bcrypt,未来可能变成 argon2id) $hash = password_hash($password, PASSWORD_DEFAULT); // 显式使用 argon2id(需 PHP 7.3+,推荐 8.x) $hash = password_hash($password, PASSWORD_ARGON2ID);
密钥哈希(HMAC与签名)的新算法
PHP 8.0+ 支持 SHA-3 系列 的 HMAC 和普通哈希,这是 NIST 标准的现代加密哈希:
| 算法 | 引入版本 | 说明 |
|---|---|---|
sha3-224 |
PHP 7.1(基于 Keccak) | SHA-3 224 位 |
sha3-256 |
PHP 7.1 | 推荐用于 HMAC |
sha3-384 |
PHP 7.1 | 安全性中等 |
sha3-512 |
PHP 7.1 | 最高安全性(但比 SHA-2 慢) |
在 PHP 8.0 中它们的内部实现经过优化,性能比早期版本提升显著。
HMAC 示例:
$key = 'secret-key'; $data = 'message'; // PHP 8.0+ 推荐用 sodium 代替传统 HMAC(更快、更安全) $hmac = sodium_crypto_auth($data, $key);
性能与安全性变化(PHP 8.x)
- PHP 8.1:
hash()函数开始支持hash_hmac_algos()返回所有可用 HMAC 算法。 - PHP 8.3:修复了某些情况下哈希算法的内存泄漏问题,并优化了
murmurhash的种子处理。 - EVP 支持:
openssl_digest()在 PHP 8.0+ 中底层切换为 OpenSSL 3.x 实现,对 SHA-3 和 Blake2 支持更好。
现在该用什么?
| 场景 | 推荐算法(PHP 8.x) | 原因 |
|---|---|---|
| 密码存储 | password_hash() 配合 PASSWORD_ARGON2ID |
抗穷举、抗 GPU 并行、自动加盐 |
| 快速校验/哈希表 | xxh128 或 murmur3f |
极其快,碰撞率低 |
| 消息认证 / 签名 | sodium_crypto_auth() 或 HMAC-SHA3-256 |
现代安全,防篡改 |
| 文件完整性 | xxh64 (快速) / sha256 (安全) |
平衡速度与可靠性 |
| 兼容旧系统 | sha256 或 sha512 |
广泛支持,性能尚可 |
重要提醒:
MD5、SHA1、SHA224等算法在 PHP 8.x 中虽然仍然可用,但 不推荐用于新项目(碰撞攻击风险已公开验证),加密场景请务必使用 Argon2id、SHA-2(至少 256 位)、SHA-3 或 Sodium。