2012-10-05 165 views
1

如果您在散列密码之前使用盐,它会使散列更安全。这是有道理的,因为彩虹表攻击变得更加困难(不可能?)。多盐保护密码

如果您使用多种盐,该怎么办?例如 - 你检查一天是星期一,还是月,小时等(或某种组合)。然后你有一个存储字段的数据库:(userid,hash1,hash2,hash3 ...)。

这会使信息更安全吗?

实施例:

1)密码 'PASS' 用户寄存器。 2)系统(本例中的php)存储每天(7个密码)的值(md5($ password。$ this_day))。进入表密码,列hash_monday,hash_tuesday等 3)用户登录,脚本检查密码'hash_'。$ this_day匹配输入内容。

+0

彩虹表攻击变得更加困难,散列并不能帮助你避免字典攻击。 – Woot4Moo

回答

6

您的系统将不再安全 - 您最终得到几个单盐数据库而不是一个。原则上它可能会更不安全,因为您可以帮助攻击者向同一个字符串提供7个哈希以供选择,他只需要猜测一个哈希。这些相同明文的多个哈希也可能会导致用于密码的加密密码强度的影响(不确定在那个密码上,它将取决于所使用的算法)。

4

也许你应该看看这个小article。你的方法有几个错误。

  1. 盐不能防止字典的攻击。如果正确使用,它可以防止彩虹桌。
  2. 为每个密码使用独特的盐。盐应该是一个随机值,并非来自已知信息。它必须与密码一起存储。
  3. 不使用MD5散列密码。 Md5被认为是坏的,而且散列密码太快了。使用现成的GPU,您可以计算每秒8 Giga MD5散列(in 2012)。这使得有可能在不到0.1毫秒的时间内用一个大约500000个单词强制整个英语词典!
  4. 使用Bcrypt用于散列密码。建议使用像phpass这样的完善库,如果您想了解如何实现它,可以阅读上面的文章。

如果你想一个机密添加到您的散列函数(如隐藏式键,或隐藏功能),你可以添加辣椒的密码。辣椒应该不是被存储在数据库中,应该保密。只要攻击者只能访问你的密码散列(SQL-Injection),而不是秘密的服务器,胡椒就可以防止字典攻击。

+0

非常好的信息... – Shurmajee

+0

我仍然没有在辣椒上卖掉,可以节省你的字典攻击 – Woot4Moo

+0

@ Woot4Moo - 你是对的,它只保护某些类型的攻击。 – martinstoeckli

0

我不相信在这种情况下多个哈希会帮助你,主要是因为当有人妥协你的数据库时,他们会注意到你有7种不同的盐来反对,并可能会作出有根据的猜测,他们是基于天一周中的。 MD5没有什么根本性的错误,因为很多人喜欢跳上这个潮流。说MD5是破碎散列的人的类型在散列函数和加密散列函数之间存在根本的误解,我会建议忽略它们。如果您需要密码散列函数,请使用SHA-2(或来自该系列或更高级别的产品)。

您需要对用户输入进行限制,正如您所知,通常建议使用随机值,但它也可以是存储在单独应用程序空间(数据库外部)的值,您只需保护该信息也是如此。我强烈建议使密码散列函数对于任何输入都需要数千次迭代。因为这会减慢数据库匹配哈希的自动化过程。

如果您的用户使用容易猜到的密码,词典攻击将每天击败您,无法防范愚蠢。

+0

不确定你的意思是散列与加密哈希,用于存储密码,你需要一个加密哈希。如果有一种已知的获取碰撞的方法,那么散列被认为是破坏的,这比暴力破解更快。正如你正确指出的那样,MD5当然太快了。盐不是秘密,没有必要隐藏它,如果你想添加一个秘密,你添加一个胡椒。我不会混合盐和胡椒粉,因为它们有不同的目的。在某些情况下,胡椒**可以防止弱密码(SQL注入)。 – martinstoeckli

+0

@martinstoeckli你有没有一份研究报告指出胡椒可以抵御弱密码?基于我对胡椒的理解,它使零感。有两类哈希,正常哈希(MD5)和加密哈希(SHA)。 MD5没有任何问题,碰撞的“缓解”不如厄运者说的那么高。如果我存储密码,我会推荐一个加密哈希,但从根本上说,MD5很好,而且世界上所有的哈希都不能为您节省密码。 – Woot4Moo

+0

如果攻击者不**具有控制服务器(并因此具有秘密的代码),则胡椒只能防止字典攻击。如果攻击者使用SQLInjection成功,通常情况下就是这种情况。你把胡椒添加到(弱)密码中,所以不是“12345”,而是实际上哈希“12345ai8-9?uz3dWe”,你会发现没有字典。 – martinstoeckli