Guidelines

密码存储

如果你的应用程序对用户进行身份验证,它很可能还会处理密码。

处理用户密码确实是一件大事,而恰当处理它们则是一件大事。

很难想象会有比应用程序受到攻击和用户密码通过互联网泄露让所有人看到更糟糕的情况。就我个人而言,我们对这个想法感到不寒而栗。那么,如何根据最佳实践安全地存储密码呢?让我们来看看几种方法。

加密与哈希

从表面上看,人们可能会认为加密听起来像是一个不错的安全密码存储解决方案,但是,完全依赖它可能会有些问题。

加密本质上是一种双向功能,当然,这意味着就像密码可以加密一样,它也可以加密 已解密。完全合乎逻辑,对吧?否则,如何验证用户的密码是否与数据库中存储的密码相匹配?

因此,解密密码的能力也是一项相当大的负担。如果有人入侵服务器并获得密码密文,他们很有可能也能够获得解密这些密码所需的密钥材料。

另一方面,哈希算法由于其单向性质而更适合密码。一旦你对某些内容进行了哈希处理,就没有将密文直接转换为原始纯文本的功能了。此属性使哈希特别适合于保护密码。

并非所有哈希值都是平等创建的

一旦你决定对密码进行哈希存储,也不会像应用哈希函数然后按天调用那样简单。

哈希有各种形状和大小,考虑到过去十年来计算技术的所有进步,其中大多数并不完全适合存储密码。

如前所述,由于哈希是单向函数,因此无法逆转。尽管从技术上讲确实如此,但哈希也是确定性的,这意味着它们也容易受到暴力攻击策略的影响,如果有足够的时间和资源,攻击者可能会将哈希值反向为原始纯文本。

出于这个原因,我们将哈希函数分为两类:

  • 加密哈希
  • 密码哈希
Feature Cryptographic hash Password hash
Speed Very fast Intentionally slow
Work factor can be adjusted No Yes

密码哈希的一个关键特征是它们有一个 “工作因子”(由单个整数或多个参数组成),用于定义计算哈希所需的精力。

随着这些年来 CPU 和 GPU 变得越来越快,对消费类硬件上的哈希值进行大规模暴力攻击变得越来越容易,这意味着随着时间的推移,哈希值的安全性会越来越低。

“工作因子” 用于确保以符合行业趋势的方式存储哈希值。随着硬件速度变快,您可以增加算法的工作因子,以确保哈希需要更多的时间和精力来解密。举个例子,在当代硬件上使用 100 毫秒。

这意味着在实践中,工作系数可能需要每2-3年增加一次。

Cryptographic hash Password hash
MD5 bcrypt
SHA-1 scrypt
SHA-2 PBKDF2
SHA-3 Argon2

标语

Secure coding made practical

Explore secure coding guidelines to understand and mitigate software vulnerabilities like the OWASP Top 10, and dive into guided training Missions to practices in real-world app simulations.

more guidelines
book a demo