使用 md5 或 sha1 的密码散列仍然有效吗?

Is still valid password hashing using md5 or sha1?

刚才我在做一个金融项目。在这里,团队正在考虑将 MD5 用于 password hashing。 但是,今天很容易复制 SHA1MD5 密码来解密,如果它们是复杂的密码,则包括在内: My$uper$ecur3PAS$word+448,你可能使用在线页面解密它就在那里。 中小型开发人员(包括我)使用那些 hashing methods,但我认为不足以提供数据库的安全性。 (不包括 firewallsnetwork securityiptables 等)。

谁能告诉我解决此漏洞的更好方法是什么?

您的想法是正确的,MD5 和 SHA1 永远不应该用于密码散列。我会按优先顺序推荐以下内容:

  • 氩气2
  • bcrypt
  • scrypt
  • PBKDF2

如果你用你正在使用的 language/framework 标记你的问题,我可以推荐特定的库或方法。

另请注意,加密 不是用在此处的正确词。这些是密​​码散列算法,不是加密算法。

根据OWASP Password Storage Cheat Sheet,建议是:

  • Argon2 is the winner of the password hashing competition and should be considered as your first choice for new applications;
  • PBKDF2 when FIPS certification or enterprise support on many platforms is required;
  • scrypt where resisting any/all hardware accelerated attacks is necessary but support isn’t.
  • bcrypt where PBKDF2 or scrypt support is not available.

对于大多数与安全相关的用例,MD5 和 SHA1 并不安全,因为可能会发现与这些算法的冲突。换句话说,给定一个输入及其哈希值,就可以推导出具有相同哈希值的另一个输入。

SHA-2 哈希算法组在许多安全用例中都是安全的,但不适用于密码哈希,因为与上述算法相比,它们的速度非常快。性能是我们不希望密码哈希处理的东西,因为这会使攻击者更容易通过在短时间内尝试各种密码来执行暴力攻击。

因此,上述 4 种算法在内存、计算能力和时间方面都非常昂贵。这些值通常被参数化,以便随着新技术随着时间的推移提高计算能力,它们可以被调整到一个高值。因此,在使用这些算法时,正确选择工作因数值非常重要。设置一个非常低的值可能会破坏目的。

除此之外,还应使用盐。

同样来自同一个 OWASP 来源:

  • Generate a unique salt upon creation of each stored credential (not just per user or system wide);

  • Use cryptographically-strong random data;

  • As storage permits, use a 32 byte or 64 byte salt (actual size dependent on protection function);
  • Scheme security does not depend on hiding, splitting, or otherwise obscuring the salt.

Salts serve two purposes:

  • prevent the protected form from revealing two identical credentials and
  • augment entropy fed to protecting function without relying on credential complexity.

The second aims to make pre-computed lookup attacks on an individual credential and time-based attacks on a population intractable