因此,在构建webapp并存储密码时,安全性和性能都是要记住的重要事项。由于GPU的速度越来越快,已经看到证据表明即使盐析SHA1密码也很容易破解,我想知道存储密码的最佳做法是什么。
我认为为了增加存储密码的安全性,您可以为salt添加一个秘密。因此,例如,python代码可以是:
import hashlib
import hmac
secret = 'XYZ'
h = hmac.new('salt' + secret, 'password')
P.S。我没有在安全论坛上发布这个,因为我想要一个webapp开发人员的观点。
答案 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之一。
您的代码有两个重要缺点:
答案 5 :(得分:0)
关于最佳做法,您可能需要阅读OWASP's Password Storage Cheat Sheet。您可能也想要阅读their other cheat sheets。