2012-07-07 267 views
1

因此,当构建一个web应用程序和存储密码时,安全和性能是需要牢记的重要事项。看到证据表明,由于GPU的速度越来越快,甚至可以轻易破解SHA1密码,我想知道存储密码的最佳做法是什么。密码盐和秘密

我认为,为了增加更多的安全性来存储密码,你可以添加一个秘密盐。因此,举例来说,这样做的Python代码可以是:

import hashlib 
import hmac 

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

P.S.我没有在安全论坛上发布这篇文章,因为我想要一个Web应用程序开发人员的视角。

+0

我没有看到一个很大的区别就在这里,因为大不了破解密码是多么难以逆转的散列值。因此,即使你的盐现在更安全,它可能只是一点点帮助(例如通过消除某些彩虹桌的使用)。会话的随机秘密通常通过生成随机比特来获得,例如使用随机呼叫。 – dolaameng 2012-07-07 13:53:47

+1

scrypt,bcrypt,PBKDF2 – CodesInChaos 2012-07-07 13:56:06

+0

请注意:[Python * hmac *](http://docs.python.org/library/hmac.html)的默认散列函数是MD5。 HMAC的算法简单来说就是应用哈希函数两次。 – Gumbo 2012-07-07 16:26:05

回答

8
+0

如果这是用于应用程序引擎的,建议使用SHA512_crypt,因为它使用的C代码比仅用于python的bcrypt/scrypt/pbkdf启用更多循环。将方法名称与散列一起存储,如果其他人在GAE上获得C实现,则可以切换并向后兼容。 – tesdal 2012-07-07 22:38:22

2

这是在Web应用程序中很常见的事情。如果黑客得到你的数据库,只要他们不知道盐以及它放在字符串中的位置,他们可以随时搜索密码。所以黑客需要这两个的代码和数据库转储才能得到真正的密码。

我看不到比无盐的方法的任何缺点,性能,同时安全性明显增加完全一样。

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

例如,黑客需要每个盐的密码表,这意味着许多计算。即使你存储在数据库中的盐,这是一个痛苦的黑客破解非标准盐(标准盐可以根据用户名盐:管理 ...)

你也可以请参阅this answer了解更多详情和解释。

然而,像BCrypt库是非常好的密码学,他们往往是由著名黑客测试,因此我不认为你可以信任他们。

3

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

添加一个“秘密”并不会真的改变任何东西。这只是一个更长的,但仍然是固定的,盐,你必须分发到检查密码的服务器,所以它真的不是那个秘密,是吗?

4

你要做的仅仅是你的盐的时间长一点......也就是说,你现在盐是saltXYZ而不是只salt

从我的角度来看,这和使用普通盐没什么两样,所以这让你的前两个问题没有意义。

就最佳实践而言,最重要的是“永远不要推出自己的密码”。不要幻想,用一个知名的图书馆来处理这些事情。这些天很受欢迎。它可能有一个漏洞,但如果它有,它可能会被发现,因为有训练的加密分析师每天都在攻击它。

+1

+1永远不会推出自己的。 – Antimony 2012-07-08 14:56:47

1

添加一个秘密不会伤害,它有助于在某些情况下。所以我建议使用一个作为防御深度措施。
但是在主要场景中密码散列的目的是,它并没有帮助:您的服务器被攻破,攻击者获悉这个秘密。

为了抵御密码猜测攻击,您应该使用故意缓慢的哈希函数,即scrypt,bcrypt和PBKDF2之一。

  1. 你不使用盐:

    你的代码中有两个重要的弱点。每个用户的盐应该不同。标准做法是64位或更多位的随机数。

  2. 单次迭代hmac速度很快,所以使用我提到的慢速方案之一。
+0

在这种情况下,HMAC键功能与盐是否非常相似? – cha0site 2012-07-07 14:05:34

+0

@ cha0site他正在使用一个常量。每个用户的盐应该不同。 – CodesInChaos 2012-07-07 15:11:38

+0

他也有一个不变的密码,我认为这是一个例子=) – cha0site 2012-07-07 16:32:25