开发者工具 · SHA 哈希计算器
为什么不能将密码存储为纯 SHA-256 哈希值
· 为什么它很重要
密码 安全 密码学
SHA-256 的设计速度很快,这正是您不希望的密码。这篇文章解释了为什么速度是问题以及密码哈希函数的不同之处。
SHA-256 不是密码存储;这是快速散列。普通的 SHA-256 为攻击者提供了相同的猜测速度,尽管它是一种加密强度较高的算法,但它并不适合。
开发人员实现登录系统并将密码存储为 SHA-256 哈希值。该算法具有很强的加密性,并且应用程序不使用盐,从而保持代码简单。当用户登录时,应用程序会对提交的内容进行哈希处理并将其与存储的值进行比较。这种设计简洁优雅,完全不适合密码存储。这不是一个理论上的问题;而是一个问题。这是身份验证系统中最常见的严重错误。在您考虑攻击者可以利用窃取的数据做什么之前,该设计看起来是可以防御的。
的缺陷并不在于 SHA-256 较弱。 SHA-256 是一种强大的加密算法,受到安全社区的信任,并在整个行业中用于完整性检查和内容寻址。缺陷在于 SHA-256 速度很快,而快速与密码所需的速度恰恰相反。密码哈希不仅仅是任何加密原语;它是一种针对特定问题而设计的特定工具:防止猜测。速度是校验和的一个特征;对于密码来说,这是一场灾难。
快速是 SHA-256 的要点 — 完整性检查需要速度,攻击者进行猜测时获得相同的速度
当 SHA-256 密码哈希值数据库遭到破坏时,攻击者无需反转哈希值。攻击者建立一个字典:常见密码,如“password”、“123456”、“hello”等等。每个候选者都使用 SHA-256 进行哈希处理(计算上很简单的操作),并根据被盗的数据库进行检查。攻击者可以使用登录服务使用的相同快速原语计算候选 SHA-256 值,然后在没有速率限制的情况下离线比较每个结果。确切的速率取决于硬件和实现,因此本文故意不做出每秒猜测或泄露时间的声明。
速度就是整个问题。 SHA-256 意味着速度很快。这就是它的设计意图。它可以让您验证下载校验和、计算内容地址并构建 Merkle 树,而无需等待。在这些应用中,速度是一个特点。对于密码来说,速度是一场灾难。当密码数据库被盗并使用 SHA-256 进行哈希处理时,攻击者的猜测速度与合法服务器的验证速度相同。这种对称性就是破坏密码安全性的原因。合法服务器和攻击者都可以获得快速通用摘要的好处;只有攻击者可以在没有应用程序登录控制的情况下离线重复它。
字典和彩虹表 - 针对无盐哈希值的预计算,以及盐会改变什么
这是预计算字典变得实用的地方。攻击者可以花一天的时间来计算 SHA-256 哈希值,用于一千个最常见的密码、Name1990 等常见模式或多种语言的整个字典。生成的表称为彩虹表。根据预先计算的表查找被盗的 SHA-256 哈希值是即时的。即使没有预先计算的表,使用 GPU 加速的哈希计算十亿个猜测也是微不足道的。攻击者的计算成本非常低,即使是弱密码也会在几分钟内消失。
ToolAcre SHA 哈希计算器直接演示了这个速度。粘贴一段短文本,单击 SHA-256 按钮,结果立即出现。这个即时结果(您在哈希计算器中所欣赏的属性)正是使普通 SHA-256 对于密码来说无法防御的属性。攻击者每次猜测都会得到相同的即时结果。对于校验和和完整性检查来说,这个速度是完美的。对于密码来说,这对于安全来说是致命的。
密码散列函数添加了什么 - bcrypt、scrypt、Argon2 和 PBKDF2 中的工作因素、内存硬度和每用户盐
salt 是在散列之前添加到密码中的随机值,因此每个用户的 salt 都是不同的。即使两个用户具有相同的密码,他们也会散列到不同的值。这打破了预先计算的彩虹表;攻击者必须为每个盐独立计算该表。通过独立生成的每用户盐,一个预先计算的表不再适用于每个帐户。然而,盐只会促使攻击者在攻击期间而不是事先计算表。如果散列仍然很快,攻击者只需并行计算更多表,并继续使用快速原语猜测每个帐户。盐是必要的,但还不够。它可以防止受害者之间重复使用字典,但不会减慢攻击者的核心操作:猜测。哈希的速度仍然是猜测的速度。
工作示例 — 与经过调整的密码哈希相比,识别通用密码的 SHA-256 的速度有多快,定性描述
密码哈希函数采用不同的方法。 Bcrypt、scrypt、Argon2id 和 PBKDF2 专为密码验证而构建。它们都包含一个工作因素:一个使散列故意变得昂贵的参数。 Argon2 是最现代的;它调整 CPU 时间和内存消耗。 Bcrypt 使用可调节的成本因子,每次增量都会使工作量加倍。所有这些都包括内置盐生成功能。这些工具在设计时考虑了攻击者模型。工作因素至关重要。
密码哈希函数使配置的成本成为每次验证的一部分。想要测试候选人的攻击者还必须为每次猜测付出代价。具体时序无法在部署之间安全复制,这就是为什么参数部分需要对实际生产级别的硬件进行基准测试。这种不对称性正是密码哈希发挥作用的原因。工作因素从“进攻方优势”转变为“防守方优势”。
迁移旧版 SHA-256 表 — 包装现有哈希并在下次登录时重新哈希
工作比较仍然是定性的,因为此存储库不包含特定密码函数或攻击者的基准。通用密码每次都会立即生成相同的明文 SHA-256,因此现有的字典条目可以通过相等性来识别它。调整后的密码记录包含其自己的盐和成本参数,并且需要为每个候选者配置工作。
这种对比确定了设计错误,但没有承诺每秒的猜测。硬件、实现和所选参数决定时序。合理的结论是不变的:通用摘要没有可调整的工作因素或内存成本,而专门选择密码散列函数来施加这些成本。
这不包括什么 - 为特定密码哈希选择参数,这取决于您的硬件和威胁模型
参数选择是特意在该计算器和本文之外进行的。正确的设置取决于服务器延迟预算、可用内存、并发性和当前的威胁模型,因此从不相关的部署中复制固定值将使安全控制变成民间传说。在生产级硬件上对所选密码功能进行基准测试,并在容量发生变化时重新访问它。
ToolAcre 无法执行该练习:其面板接受文本和 SHA 标识符,然后返回纯摘要。它不公开盐字段、内存设置、迭代控制或密码记录格式。这种缺失是一个有用的边界信号,而不是通过在文本框中重复散列密码来解决的缺失功能。
要点:即时结果是警告 — ToolAcre SHA 哈希计算器显示 SHA-256 的速度有多快,这就是为什么它不能保存用户的密码
一直将密码存储为普通 SHA-256 的旧系统可以向前迁移,而无需所有用户立即重置。该技术是“包装”旧的哈希值:获取 SHA-256 值并使用 Argon2 再次对其进行哈希处理。用户下次登录时,系统会检查旧的 SHA-256 是否匹配;如果是,它会根据该结果计算 Argon2 并存储包装后的版本。下次用户登录时,系统将直接针对 Argon2 进行验证。迁移在正常登录流程中透明地进行。
这种包装方法可确保已被泄露的旧密码现在受到工作因素的保护。拥有旧数据库 SHA-256 哈希值的攻击者无法再简单地破解它们;他们必须攻击包装版本,其中包括 Argon2 的成本。在用户的正常登录流程中,迁移对用户来说是透明的。每次登录都会创造一个增强哈希值的机会,而不会破坏用户体验。选择正确的工作因素取决于您的硬件和威胁模型。 Argon2 默认值是合理的:19 迭代、512 MB 内存和 1 Web 服务并行性。