密码盐&秘密

时间:2012-07-07 13:46:22

标签: python performance security google-app-engine passwords

因此,在构建webapp并存储密码时,安全性和性能都是要记住的重要事项。由于GPU的速度越来越快,已经看到证据表明即使盐析SHA1密码也很容易破解,我想知道存储密码的最佳做法是什么。

我认为为了增加存储密码的安全性,您可以为salt添加一个秘密。因此,例如,python代码可以是:

import hashlib
import hmac

secret = 'XYZ'
h = hmac.new('salt' + secret, 'password')
  • 这是常见的事吗?
  • 这有什么缺点?
  • 该领域的最佳做法是什么?

P.S。我没有在安全论坛上发布这个,因为我想要一个webapp开发人员的观点。

6 个答案:

答案 0 :(得分:8)

另请查看passlib:http://pypi.python.org/pypi/passlib/

答案 1 :(得分:4)

你只是让你的盐更长一点......也就是说,你的盐现在是saltXYZ,而不仅仅是salt

从我的角度来看,这与使用普通盐没有任何不同,所以这使得你的前两个问题没有实际意义。

就最佳实践而言,最重要的是“永不滚动自己的加密”。不要花哨,使用一个知名的图书馆来处理这些事情。 bcrypt这些天很受欢迎。它可能有一个漏洞利用,但如果确实如此,它可能会被发现,因为每天都有Trained Cryptoanalysts攻击它。

答案 2 :(得分:3)

标准是不能反复使用相同的盐。例如,使用用户名作为salt。或者生成随机盐并将其添加到结果中。

添加“秘密”并没有真正改变任何事情。它只是一个更长但仍然固定的盐,你必须将它分发给检查密码的服务器,所以它真的不是那个秘密,是吗?

答案 3 :(得分:2)

这在Web应用程序中非常常见。如果黑客获取了您的数据库,他们可以根据需要搜索密码,如果他们不知道盐以及它放在字符串中的位置。因此,黑客需要两者代码和数据库转储才能获得真实密码。

与没有盐的方法相比,我看不出任何缺点,性能大致相同,而安全性明显增加。

更重要的是,对于您编码的每个密码,盐应该是不同的,您必须选择足够长的盐(越长越好)。

例如,黑客需要每个盐的密码表,这意味着许多计算。即使您将盐存储在数据库中,黑客也很容易破解非标准盐(标准盐可能是基于用户名的盐: admin root 。 ..)

您还可以查看this answer了解更多详情和解释。

然而,像BCrypt这样的库非常适合加密,它们经常被知名的黑客测试,所以我认为你可以相信它们。

答案 4 :(得分:1)

添加秘密不会造成伤害,并且在某些情况下会有所帮助。所以我建议使用一个,作为深度防御措施 但是在密码哈希的主要方案中,它没有帮助:您的服务器受到攻击,攻击者就会知道这个秘密。

要防止密码猜测攻击,你应该使用故意慢的哈希函数,即scrypt,bcrypt和PBKDF2之一。

您的代码有两个重要缺点:

  1. 你没有使用盐。每个用户的盐应该是不同的。标准做法是64位或更多位的随机数。
  2. 单次迭代hmac很快,所以请使用我提到的一种慢速方案。

答案 5 :(得分:0)

关于最佳做法,您可能需要阅读OWASP's Password Storage Cheat Sheet。您可能也想要阅读their other cheat sheets