2012-06-16 54 views
4

据我的理解,在阅读和研究之后,使用盐的目的应该是每一个存储的密码都是不同的盐。用Python腌制哈希密码(每个新密码都有不同的盐)

如果使用相同的盐来存储所有密码,我可以理解如何实现这一点,因为我可以将salt存储到一个常量私有变量并使用它。但是,情况并非如此。

尽管用新的不同的盐存储每个新密码是完全有意义的,但我怎么知道哪个用户的密码与哪个盐有关?我想到的快速解决方案是将salt与用户的表格属性一起存储(可能称为“盐”),但如果容易从盐中找到盐,那么它将失去将盐从第一位置开始的目的数据库。

任何人都可以就此建议吗?

注:我使用的是无论是Python的内置库(hashlib)或Bycrypt(CryptacularPasslib

回答

7

的快速解决方案,我认为,是对盐存储与用户的表属性

沿

这正是你所做的。知道盐并没有真正减损他们的好处:

  • 数据库中相同的密码将具有不同的哈希值。
  • 彩虹表不会工作。
  • 尝试与任何相匹配的暴力攻击会放慢速度。
+0

哈啊....这是很酷...哈哈...我看过你的第一篇文章,没有你们这些最新的3分,我打字更疑惑的问题,直到你用这些最新的3分回答我的疑问。快速响应非常感谢! – MrCooL

0

没有密码的目的只是为了避免简单的字典攻击。 TMHO在许多应用程序中只有一个散列用于所有密码。

例如,让我们说:神,太阳和爱是常见的密码。任何攻击者都可以拥有包含这些单词的字典,并且有散列。

如果不是存储散列(密码),而是存储散列(密码+盐)(或散列(盐+密码)),则可以使此字典的攻击无效,因为如果您的盐是'dza $ ^“é) àù'字典包含'dza $ ^“é)àùgod'的概率往往为0.

在每次输入中更改盐值也可能是一种很好的做法(但我认为不太常见),但您必须找到如何检索它来检查密码。

+1

嗨@Aster,感谢您的分享。 Ermnn ...据我所知,每个新密码都需要不同的盐,原因很简单: 1.同一密码与同一个盐具有相同的哈希值,因此黑客/攻击者很容易破坏多个一旦他们设法破坏其中一个密码,就会有一个密码 无论如何,我认为你的回答会帮助其他人想要了解更多使用盐教育更多人的好处。为共享欢呼。 :) – MrCooL

+0

我同意(正如我在文章中提到的,我犯了一个可能让它不清楚的错字),但我怀疑这是在许多应用程序中具体完成的事情(据我所知,大多数CMS如Wordpress和Joomla都没有没有实现它)。 – AsTeR

1

如果您使用的是cryptacular.bcrypt.BCRYPTPasswordManager,那么您无需担心盐类。它负责生成和存储散列的盐。

您可以在下面看到,相同密码的哈希串是不同的。这意味着盐已被使用。

对于前:

>>> import cryptacular.bcrypt 
>>> crypt = cryptacular.bcrypt.BCRYPTPasswordManager() 
>>> crypt.encode('aaa') 
'$2a$10$B0czYdLVHJG4x0HnEuVX2eF7T9m1UZKynw.gRCrq8S98z84msdxdi' 
>>> crypt.encode('aaa') 
'$2a$10$Ni7K.pQoal3irbGmREYojOYoi0lye/W0Okz7jqoynRJhW5OCi8Upu'