PHP密码哈希与加盐:2025年最佳实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

哈希、加盐与您的安全:为什么这在2025年如此重要?

\n\n

想象一下:您编写了一个很棒的网站,一切运行正常,用户纷纷注册。但有一天,数据库泄露到了网络上。攻击者会看到什么?如果您以明文形式存储密码——那将是一场灾难。如果您使用老旧的md5——那也几乎一样糟糕。而如果您应用了安全哈希与加盐——攻击者只会看到一堆无意义的字符。在2025年,这不仅仅是一个建议,而是一项安全标准。

\n\n

在本文中,我们将详细讲解如何使用现代算法、加盐和最佳实践在PHP中正确地对密码进行哈希处理。您将了解为什么旧方法很危险,以及如何在10分钟内过渡到安全的密码存储。

\n\n

为什么md5和sha1是邪恶的?

\n\n

许多初级开发者都会犯同一个错误:使用md5($password)或sha1($password)。在2025年,这不仅仅是糟糕的实践,更是通往漏洞的直接途径。为什么?

\n\n
    \n
  • 计算速度。 MD5和SHA1是为速度而设计的,而不是为安全性。现代GPU每秒可以处理数十亿个哈希。
  • \n
  • 缺少加盐。如果两个用户选择了相同的密码,他们的哈希值将是相同的。这使得彩虹表攻击成为可能。
  • \n
  • 碰撞。 MD5已经发现了实际碰撞——两个不同的输入产生相同的哈希值。
  • \n
\n\n

幸运的是,PHP内置了解决所有这些问题的函数。而且这不需要安装任何第三方库。

\n\n

password_hash和password_verify:您的秘密武器

\n\n

从PHP 5.5.0开始,该语言引入了两个神奇的函数:password_hash()和password_verify()。它们会自动生成盐值,使用加密强度高的算法,并防止时序攻击。

\n\n

最简单的使用示例:

\n\n
// 哈希密码\n$password = "MySuperSecureP@ssw0rd!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\necho $hash; // $2y$10$...\n
\n\n

这里发生了什么?password_hash函数:

\n
    \n
  • 生成了一个随机的盐值
  • \n
  • 选择了最优算法(默认是bcrypt)
  • \n
  • 计算了哈希值
  • \n
  • 返回了一个包含哈希值、盐值和算法信息的字符串
  • \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\n

2025年应该选择哪种算法?

\n\n

默认情况下,password_hash使用bcrypt。对于大多数项目来说,这是一个极好的选择。但我们还有其他选项:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
算法常量推荐
BcryptPASSWORD_BCRYPT极佳选择,广泛支持
Argon2iPASSWORD_ARGON2I抗侧信道攻击
Argon2idPASSWORD_ARGON2ID2025年最佳选择
\n\n

Argon2id是PHC(密码哈希竞赛)的获胜者。它既能抵抗GPU攻击,也能抵抗时序攻击。如果您的PHP编译时支持Argon2(在PHP 8.x中这已经是标准),请使用它。

\n\n

配置哈希计算成本

\n\n

安全哈希与加盐的一个关键思想是使计算

博客

书籍推荐