术语表

密码哈希是什么?用不可逆的单向变换安全保存密码

密码哈希是一种用不可逆的单向变换来保存密码的方法。本文隐去攻击步骤、从防御视角讲解它与加密(可解密)的区别、直接使用 MD5 或 SHA-256 为何危险(彩虹表·暴力破解),以及安全的做法(salt+慢速哈希:bcrypt/Argon2/scrypt)。

发布于 2026-06-27 更新于 2026-10-06 2 分钟阅读
本页目录

密码不能原样保存到数据库里。那该怎么保存呢?答案就是哈希。本文讲解其机制,以及保证安全的要点(不会写出攻击步骤)。

哈希 ≠ 加密

两者常被混淆,但目的恰好相反。加密是「为了以后读回,可用密钥还原」的变换。**哈希是「无法还原(单向)」**的变换。密码这种信息,连运营方本来都不需要读回,所以特意采用无法还原的哈希更合适。

加密(可逆)

明文 ⇄ 密文。有密钥就能还原。适用于以后要读回的数据

哈希(单向)

密码 → 哈希值。无法还原。适用于保存密码

密码用『无法还原』的哈希来保存。与加密(可还原)的目的恰好相反。

登录时,要看的是「把输入的密码用同样的步骤做哈希,再和已保存的哈希是否一致」。无需取出原始密码。

为什么「裸用 MD5/SHA-256」还不够

MD5 和 SHA-256 是快速哈希。这本是有用的特性,但在密码保存上却成了弱点。因为攻击者可以针对泄露的哈希,每秒计算海量候选来逐一比对。

  • 彩虹表:把「常见密码→其哈希」预先计算好的巨大对照表。如果是裸哈希,只要查表就能找到匹配。
  • 暴力破解(brute force):哈希越快,单位时间内能尝试的候选越多=越容易被攻破。

通用哈希与密码哈希的区别

两者都叫「哈希」,但设计用途不同。只有右侧那一列才适合用于保存密码。

通用哈希(MD5、SHA-1、SHA-256)密码哈希(Argon2id、bcrypt、scrypt、PBKDF2)
设计用途检测文件篡改、签名等保存密码
速度越快越好故意做得很慢(可调)
salt不在设计之内在设计之内(PBKDF2 由调用方提供)
调节成本不可以成本、迭代次数或内存;随时间提高
用于保存密码不要用使用

NIST SP 800-63B-4 同样要求,用以 salt 和成本因子为输入的密码哈希方案来保存密码,成本要在不影响性能的前提下尽量设高,并随时间提高。

两项安全措施

1

加上 salt(每个用户不同的值)

保存前,先为每个用户混入一个不同的随机值(salt),再做哈希。这样即使密码相同,每个人的保存值也各不相同,彩虹表被废掉,对重复使用密码的批量破解也无从下手。

2

使用故意做得很慢的专用哈希

bcrypt / Argon2 / scrypt 可以把计算有意做得很重(成本参数)。对正常登录的单次而言慢到无所谓,但能把攻击者的暴力破解拖到现实中不可行的速度。salt 的添加也已内置其中。

真实案例:泄露通知里写着「已哈希」时

泄露公告有时会说明密码是以明文、哈希还是加密的形式保存的。下面把本站报道过的案例按保存方式整理。

案例公布的密码相关信息对用户意味着什么
宅ふぁいる便(Takufile-bin)(2019 年)以明文保存可以原样读出。使用相同密码的其他服务也有风险
樱花互联网(Sakura Internet)(2026 年)部分初始密码没有做哈希仍在使用初始密码的人需要立即修改
Gyazo(2026 年)密码哈希泄露;未公布方式视方式而定可能被还原。该公司要求用户修改密码

阅读通知时要记住两点:

  • 仅凭「已哈希」无法判断是否安全。裸 MD5 和加了 salt 的慢速哈希,在密码被还原的难易程度上差别巨大
  • 如果没有写明方式,就按方式薄弱来应对。修改该服务以及其他使用相同密码的服务的密码

可以通过如何检查密码是否已泄露,确认你的邮箱地址是否出现在过去的泄露中。

如何检查自己的网站和账户

1

作为用户:留意密码重置的方式

如果「忘记密码」会把原来的密码通过邮件发给你,这个服务很可能以明文或可还原的形式保存密码。不要在那里使用你在其他地方也用的密码。

2

作为用户:检查密码的强度

哈希对又长又难猜的密码保护效果最好。用密码强度检查工具确认大致的强度,并把保管交给密码管理器。

3

作为开发者:检查用哪个函数保存密码

找出代码中用来保存和验证密码的函数。PHP 的 password_hash()、Django 内置的认证、或 bcrypt/Argon2 库都是密码专用的,能满足基本要求。凡是直接调用 md5()、sha1() 或 sha256 的地方,都是迁移对象。

4

作为开发者:检查保存的值和设置

如何识别已保存的哈希、OWASP 的最低设置、以及如何从薄弱算法迁移,见密码的安全保存方法。

本站观点:不要自己拼凑

以为「给 MD5 加个 salt 就够了」,是一个常见的错误。安全的密码保存,要把 salt 的生成与保管、计算成本的调节、对时序差异的考量都包含进来,才算成立。比起自己东拼西凑,交给语言、框架的官方密码函数(很多内部都用 bcrypt/Argon2)来处理,在本站看来才是最安全、最可靠的。新项目请把 Argon2id 作为首选。

出处(一手资料)

  • NIST,“SP 800-63B-4 Digital Identity Guidelines: Authentication and Authenticator Management”(2025 年 8 月) — pages.nist.gov(以 salt 和成本因子为输入的哈希方案、随时间提高成本)
  • OWASP,“Password Storage Cheat Sheet” — cheatsheetseries.owasp.org(哈希与加密的区别、推荐算法、工作因子)
  • RFC 9106,“Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications” — rfc-editor.org
  • 各案例的出处(各公司自己的公告)列在本站链接的文章中

继续阅读

分类编号

CWE 对导致漏洞的弱点类型进行分类,MITRE ATT&CK 对攻击者的技术进行分类。两者均由 MITRE 维护,广泛用于标注漏洞信息和检测规则。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

© 2026 The MITRE Corporation. This work is reproduced and distributed with the permission of The MITRE Corporation. MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation. The MITRE Corporation (MITRE) hereby grants you a non-exclusive, royalty-free license to use ATT&CK® for research, development, and commercial purposes. Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ATT&CK Terms of Use

FAQ

Q哈希和加密有什么区别?
A

加密是『有密钥就能还原(可解密)』的变换,用于以后需要读回数据的场景。哈希是『无法还原(单向)』的变换。密码本来就不需要运营方读回,所以特意采用无法还原的哈希更合适。即便数据库被盗,也无法从哈希中直接取出原始密码。

Q用 MD5 或 SHA-256 做哈希就安全吗?
A

仅此还不够。MD5/SHA-256 是『快速』哈希,攻击者每秒能尝试海量候选,因此常见密码会被暴力破解或彩虹表(预先计算好的对照表)攻破。要做到安全,需要为每个用户加上不同的『salt』,并使用『故意做得很慢』的专用哈希(bcrypt·Argon2·scrypt)。

Q到底该用哪一个?
A

新项目首选 Argon2(尤其是 Argon2id),其次是 bcrypt 或 scrypt。它们的机制中都内置了 salt 的添加与计算成本的调节。比起自己拼凑 MD5+salt,使用这些标准实现(语言/框架的官方函数)更安全、更可靠。

Q哈希后的密码会被破解吗?
A

哈希无法反向计算出密码。但可以把候选密码用同样的方式做哈希,检查是否一致。所以短的或常见的密码很容易被找出来,算法越快越是如此。如果密码足够长、没有重复使用,并且用加了 salt 的慢速哈希保存,要找出它在现实中就不可行。

Q忘记密码时,为什么服务不告诉我原来的密码?
A

因为正确做哈希的服务,自己也没有你原来的密码。所以流程是重置(由你设置新密码)。反过来说,会把原来的密码通过邮件发给你的服务,很可能是以明文或可还原的形式保存的。

Q公司公布密码哈希泄露时,我应该修改密码吗?
A

应该。公司往往不公布哈希方式,而薄弱的方式是可以被还原的。在使用相同密码或只稍作改动的密码的其他服务上,也要一并修改。