哈希算法:完整指南
哈希算法是现代计算安全性和数据完整性的基石。从密码存储到文件验证,理解不同的哈希函数以及何时使用它们对于构建安全应用程序至关重要。本指南涵盖了您需要了解的关于密码学哈希的所有内容,从基础知识到生产级最佳实践。
什么是哈希?
哈希是一种单向数学函数,它接受任意大小的输入并生成固定大小的输出,称为哈希值或摘要。哈希的关键特性使其在安全性和数据完整性中不可或缺:它是确定性的(相同的输入始终产生相同的哈希)、单向的(您无法从哈希反向工程原始输入)、快速计算的,并且即使是最微小的输入更改也会产生完全不同的哈希。 将哈希想象成数据的指纹。就像人的指纹唯一标识他们一样,哈希唯一标识一段数据。如果两个文件产生相同的哈希,它们(几乎可以肯定)是相同的。如果哈希不同,文件肯定不同。这个属性使哈希对于验证数据完整性、检测更改和安全存储密码非常有用。 密码学哈希函数有额外的属性使其适合安全应用程序。它们具有抗碰撞性(找到产生相同哈希的两个不同输入在计算上是不可行的)、抗原像性(从哈希中找到原始输入在计算上是不可行的)和雪崩效应(输入的微小更改会彻底改变输出)。 哈希在软件开发的许多领域中使用。密码存储使用哈希,因此即使数据库被泄露,密码也保持安全。文件完整性验证使用哈希来检测损坏或篡改。数字签名使用哈希来有效地签署大型文档。区块链使用哈希来链接块并验证交易。Git 使用哈希来识别提交和对象。 不同的哈希算法针对不同的目的进行了优化。MD5 和 SHA-1 曾经很流行,但现在被认为在密码学上已被破解,不应用于安全应用程序。SHA-256 和 SHA-512 是 SHA-2 系列的一部分,被广泛认为对大多数用途是安全的。对于密码哈希,像 bcrypt、scrypt 和 Argon2 这样的专用算法提供了额外的保护,防止暴力攻击。
常见哈希算法
MD5(消息摘要算法 5)生成 128 位(32 个十六进制字符)哈希。虽然速度很快并且仍然用于非安全用途,如校验和和缓存键,但 MD5 在密码学上已被破解。研究人员可以生成碰撞(产生相同哈希的不同输入),使其对安全应用程序不安全。切勿使用 MD5 存储密码或验证安全内容。它对文件完整性检查仍然可以,前提是您不担心有意的篡改。 SHA-1(安全哈希算法 1)生成 160 位(40 个十六进制字符)哈希。与 MD5 一样,SHA-1 在密码学上已被破解。Google 在 2017 年展示了实际的碰撞攻击(SHAttered)。主要浏览器已弃用用于 SSL 证书的 SHA-1,Git 正在从 SHA-1 迁移。避免在新项目中使用 SHA-1。 SHA-256(SHA-2 系列的一部分)生成 256 位(64 个十六进制字符)哈希。这是当今最广泛使用的密码学哈希算法。SHA-256 被认为对大多数应用程序是安全的,包括数字签名、证书验证和区块链。比特币使用 SHA-256 进行工作量证明挖掘。SSL/TLS 证书使用 SHA-256。它在安全性和性能之间取得了很好的平衡。 SHA-512(也是 SHA-2 系列的一部分)生成 512 位(128 个十六进制字符)哈希。它提供比 SHA-256 更高的安全裕度,但生成时间稍长。SHA-512 通常在 64 位系统上比 SHA-256 更快,因为它的内部操作使用 64 位字。当最大安全性很重要并且哈希大小不是问题时使用它。 对于密码哈希,使用专用算法,而不是通用哈希函数。Bcrypt 是为密码存储设计的,具有可调的工作因子,随着硬件改进而增加。Scrypt 在设计上消耗内存,使 ASIC 和 GPU 攻击更加困难。Argon2 是密码哈希竞赛的获胜者,提供了针对 GPU 和侧信道攻击的最佳保护。这些算法包含自动盐值,并且被故意设计得很慢,以挫败暴力攻击。
何时使用每种算法
为您的用例选择正确的哈希算法对于安全性和性能至关重要。以下是不同场景的建议。 密码存储:始终使用 bcrypt、scrypt 或 Argon2。切勿使用 MD5、SHA-1、SHA-256 或 SHA-512 进行密码哈希。通用哈希函数速度太快——攻击者可以每秒尝试数十亿个密码。密码哈希算法被故意设计得很慢并包含盐值。在这三者中,Argon2 提供了针对现代攻击的最佳保护,但 bcrypt 具有最广泛的库支持并且对大多数应用程序来说已经足够了。 文件完整性和校验和:对于安全应用程序(验证下载、检测篡改),使用 SHA-256 或 SHA-512。如果有意攻击是一个问题,这些提供了加密安全性。对于简单的错误检测(检测意外损坏,而不是有意的更改),MD5 足够快。数据库通常使用 MD5 进行内部校验和,因为速度很重要,并且威胁模型不包括有意的篡改。 数字签名:使用 SHA-256 或 SHA-512。数字签名算法(RSA、ECDSA)首先对文档进行哈希,然后对哈希进行签名。SHA-256 在签名大小和安全性之间取得了很好的平衡。对于长期归档,其中未来的计算进步是一个问题,考虑 SHA-512。 数据去重和缓存键:SHA-256 提供了良好的碰撞抵抗性,对于不需要密码学安全性的应用程序,MD5 或 SHA-1 可能足够快。许多内容可寻址存储系统(Git、Docker)使用 SHA-256 或正在从 SHA-1 迁移。对于简单的内存缓存键,其中碰撞不是安全问题,较快的非加密哈希(如 MurmurHash 或 xxHash)可能更合适。 区块链和加密货币:比特币使用 SHA-256,以太坊使用 Keccak-256(SHA-3 的一个变体)。如果您正在构建区块链应用程序,请遵循平台的标准哈希算法。 API 完整性和 HMAC:对于验证消息未被篡改,使用 HMAC-SHA256。HMAC 将哈希函数与密钥结合以创建消息身份验证代码。它比简单的哈希更安全,因为没有密钥的攻击者无法生成有效的 HMAC。 一般规则:对于新项目,默认使用 SHA-256,除非您有密码(使用 bcrypt/Argon2)或特定性能需求的特定需求。避免在任何安全关键应用程序中使用 MD5 和 SHA-1。当安全性比性能更重要时,优先选择 SHA-512 而不是 SHA-256。始终对密码使用专用密码哈希算法,切勿使用通用哈希函数。
试用工具
哈希生成器
了解更多
常见问题
哈希生成器
常见问题 →