Hash Functions Explained for Developers (MD5, SHA-256, bcrypt)

March 2026 · 18 min read · 4,206 words · Last Updated: March 31, 2026Advanced

💡 Key Takeaways

  • What Hash Functions Actually Do (And Why You Should Care)
  • MD5: The Broken Hash Function That Won't Die
  • SHA-256: The Workhorse of Modern Cryptography
  • bcrypt: When Slow Is Actually Good

我仍然记得那天我必须向我们的CEO解释为什么我们的整个用户数据库被泄露。那是2016年,我已经做了八年的安全工程师,我以为我知道自己在做什么。我们使用MD5来哈希密码——这是我加入之前几年前做出的决定——攻击者在不到48小时内破解了我们340,000个用户密码的87%。这次泄露给我们带来了230万美元的补救费用,无数的工程时间,几乎毁掉了我们的声誉。这个事件改变了我对哈希函数的看法,这也是我今天写这篇文章的原因。

💡 关键要点

  • 哈希函数的实际作用(以及为什么你应该关心)
  • MD5:无法消亡的破损哈希函数
  • SHA-256:现代加密学的工作马
  • bcrypt:慢速实际上是好的时候

哈希函数是现代软件安全的无形守护者,但我所辅导的大多数开发者并不真正理解它们。他们知道应该使用它们,但不知道一个与另一个有何不同,或者何时速度成为负担而非资产。本文将改变这一点。我将逐步讲解你会遇到的三种最重要的哈希函数——MD5、SHA-256和bcrypt——不仅解释它们如何工作,还说明何时使用每一种,更重要的是,何时完全避免使用它们。

哈希函数的实际作用(以及为什么你应该关心)

哈希函数接受任意大小的输入并生成固定大小的输出,称为哈希或摘要。把它想象成一个数学肉绞机:你可以放入一整头牛或一个汉堡饼,但出来的总是相同大小。魔力在于这个过程是确定性的——相同的输入总是产生相同的输出——但几乎不可能逆转。

好的加密哈希函数应具备以下特点:首先,它必须是确定性的。哈希“password123”一百万次,每次都会得到相同的结果。其次,它必须在一个方向上计算快速,但逆向计算在计算上不可行。第三,即使输入的微小变化也应该产生完全不同的输出——这称为雪崩效应。改变输入中的一位,输出中的大约50%的位应该翻转。

第四,它必须是抗碰撞的。碰撞发生在两个不同的输入产生相同的哈希输出时。尽管碰撞在数学上是不可避免的(输入是无限的,但输出是有限的),一个好的哈希函数使找到碰撞变得极其困难,几乎不可能。最后,输出应该显得随机且均匀分布,即使它完全是确定性的。

我见过开发者把哈希函数与加密混淆,所以让我说得清楚:加密是可逆的,需要正确的密钥,而哈希不是。当你加密数据时,打算稍后解密它。当你哈希数据时,你是在创建一个单向指纹。这个区别至关重要,因为它决定了你应该为哪个工作使用哪个工具。

在我日常的金融应用安全工作中,我使用哈希函数有三个主要目的:验证数据完整性(确保文件没有被篡改)、创建数字签名和存储密码。每个用例都有不同的要求,这就是理解哈希函数之间差异的重要性。

MD5:无法消亡的破损哈希函数

MD5(消息摘要算法5)是由罗纳德·李维斯特在1991年设计的,生成128位(16字节)的哈希值,通常表示为32个字符的十六进制字符串。十多年中,它是从密码存储到文件完整性验证的首选哈希函数。如今,它在加密上已经被破解,但我每月至少仍然在生产代码中看到它一次。

"最快的哈希函数通常是安全性最差的选择——在加密学中,速度是一种脆弱性,而不是一种特性。"

针对MD5的第一次严重碰撞攻击在2004年由肖云·王及其同事发表。他们展示了找到碰撞比理论上应该需要的2^64次操作要容易得多。到2008年,研究人员创建了两个完全不同的可执行文件,生成相同的MD5哈希。2012年,Flame恶意软件利用MD5碰撞伪造了Microsoft数字证书。这一切并不仅仅是墙上的文字——那是用霓虹灯喷涂的字。

以下是MD5在实际中的样子。字符串“Hello, World!”生成的MD5哈希是:65a8e27d8879283831b664bd8b7f0ad4。只需将一个字符的改变为“Hello, World?”,你将得到:7f138a09169b250e9dcb378140907378。注意输出是多么截然不同——这就是雪崩效应正常工作。问题不是MD5未能满足这一基本要求;而是该算法存在数学弱点,允许攻击者比他们应当能够的速度更快地找到碰撞。

那么,为什么开发者仍然使用MD5?速度和熟悉性。MD5非常快速——在我的开发机器上,我每秒可以计算大约4亿个MD5哈希。几乎每一种编程语言和框架中都可以找到它。我听过每一个借口:“我们只是用它来做校验和,而不是安全性,”或者“我们的系统不够重要,不会被攻击,”或我最喜欢的借口,“我们一直都是这么做的。”

让我说得直接:在2026年,MD5可接受的使用场景只有两个。首先,你可以将其用于非加密目的,如创建缓存键或分区数据,碰撞抗性不重要。其次,你可能需要它来与正在积极更换的旧系统保持向后兼容。就这些。如果你在任何与安全相关的事情上使用MD5——密码、数字签名、证书验证——你正在犯一个最终会让你付出代价的错误。

性能论证已经不成立。像SHA-256这样的现代替代方案对几乎任何用例都足够快,而且安全性带来的好处远远超过了微不足道的性能差异。在我工作的金融系统中,我们每天处理数百万的交易,从MD5切换到SHA-256每笔交易只增加了不到2毫秒的延迟——这对用户来说完全无法察觉,但安全性显著提高。

SHA-256:现代加密学的工作马

SHA-256(安全哈希算法256位)是SHA-2系列的一部分,由NSA设计并于2001年发布。它产生一个256位(32字节)的哈希值,通常表示为64个字符的十六进制字符串。与MD5不同,SHA-256没有已知的实际碰撞攻击,使其成为当前大多数加密应用的标准。

C

Written by the Cod-AI Team

Our editorial team specializes in software development and programming. We research, test, and write in-depth guides to help you work smarter with the right tools.

Share This Article

Twitter LinkedIn Reddit HN

Related Tools

HTML to PDF Converter — Free, Accurate Rendering Help Center — cod-ai.com cod-ai.com API — Free Code Processing API

Related Articles

Prettify JSON Online: Format Messy JSON — cod-ai.com 10 TypeScript Tips That Reduce Bugs by 50% — cod-ai.com SQL Formatter: Make Queries Readable

Put this into practice

Try Our Free Tools →
哈希函数速度主要用例安全状态
MD5极快(约300 MB/s)校验和,文件完整性加密上已被破解 - 不应用于密码
SHA-256非常快(约150 MB/s)数字签名,证书,区块链完整性安全,对密码过快
bcrypt故意慢速(可调节)密码哈希推荐用于密码存储
SHA-1非常