哈希、加盐与您的安全:为什么这在2025年如此重要?
\n\n想象一下:您编写了一个很棒的网站,一切运行正常,用户纷纷注册。但有一天,数据库泄露到了网络上。攻击者会看到什么?如果您以明文形式存储密码——那将是一场灾难。如果您使用老旧的md5——那也几乎一样糟糕。而如果您应用了安全哈希与加盐——攻击者只会看到一堆无意义的字符。在2025年,这不仅仅是一个建议,而是一项安全标准。
\n\n在本文中,我们将详细讲解如何使用现代算法、加盐和最佳实践在PHP中正确地对密码进行哈希处理。您将了解为什么旧方法很危险,以及如何在10分钟内过渡到安全的密码存储。
\n\n为什么md5和sha1是邪恶的?
\n\n许多初级开发者都会犯同一个错误:使用md5($password)或sha1($password)。在2025年,这不仅仅是糟糕的实践,更是通往漏洞的直接途径。为什么?
- \n
- 计算速度。 MD5和SHA1是为速度而设计的,而不是为安全性。现代GPU每秒可以处理数十亿个哈希。 \n
- 缺少加盐。如果两个用户选择了相同的密码,他们的哈希值将是相同的。这使得彩虹表攻击成为可能。 \n
- 碰撞。 MD5已经发现了实际碰撞——两个不同的输入产生相同的哈希值。 \n
幸运的是,PHP内置了解决所有这些问题的函数。而且这不需要安装任何第三方库。
\n\npassword_hash和password_verify:您的秘密武器
\n\n从PHP 5.5.0开始,该语言引入了两个神奇的函数:password_hash()和password_verify()。它们会自动生成盐值,使用加密强度高的算法,并防止时序攻击。
最简单的使用示例:
\n\n// 哈希密码\n$password = "MySuperSecureP@ssw0rd!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\necho $hash; // $2y$10$...\n\n\n这里发生了什么?password_hash函数:
- \n
- 生成了一个随机的盐值 \n
- 选择了最优算法(默认是bcrypt) \n
- 计算了哈希值 \n
- 返回了一个包含哈希值、盐值和算法信息的字符串 \n
验证密码也同样简单:
\n\n// 验证密码\n$inputPassword = "MySuperSecureP@ssw0rd!";\nif (password_verify($inputPassword, $hash)) {\n echo "密码正确!";\n} else {\n echo "密码错误。";\n}\n\n\n请注意:您不需要单独存储盐值。它已经嵌入到哈希值中了。这就是安全哈希与加盐的实际应用。
\n\n2025年应该选择哪种算法?
\n\n默认情况下,password_hash使用bcrypt。对于大多数项目来说,这是一个极好的选择。但我们还有其他选项:
| 算法 | \n常量 | \n推荐 | \n
|---|---|---|
| Bcrypt | \nPASSWORD_BCRYPT | \n 极佳选择,广泛支持 | \n
| Argon2i | \nPASSWORD_ARGON2I | \n 抗侧信道攻击 | \n
| Argon2id | \nPASSWORD_ARGON2ID | \n 2025年最佳选择 | \n
Argon2id是PHC(密码哈希竞赛)的获胜者。它既能抵抗GPU攻击,也能抵抗时序攻击。如果您的PHP编译时支持Argon2(在PHP 8.x中这已经是标准),请使用它。
\n\n配置哈希计算成本
\n\n安全哈希与加盐的一个关键思想是使计算