多个盐保护密码

时间:2012-10-05 19:45:43

标签: security hash passwords salt

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

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

这会使信息更多(或更少)安全吗?

示例:

1)用户注册密码为“PASS”。 2)系统(本例中为php)存储每天的值(md5($ password。$ this_day))(7个密码)。到表密码,列hash_monday,hash_tuesday等。 3)用户登录,脚本检查密码'hash _'。$ this_day匹配输入的内容。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

  1. 盐不能防止字典攻击。如果使用得当,它可以防止彩虹表。
  2. 为每个密码使用唯一的salt。盐应该是随机值,而不是来自已知信息。它必须与密码一起存储。
  3. 不使用MD5 进行散列密码。 Md5被认为是破碎的,并且散列密码的速度太快了。使用现成的GPU,您可以计算每秒8 Giga MD5哈希值(in 2012)。这样就可以在不到0.1毫秒的时间内用大约500000个字来强制整个英文字典!
  4. 使用 Bcrypt 进行散列密码。建议使用像phpass这样完善的库,如果您想了解它是如何实现的,可以阅读上面的文章。
  5. 如果要为哈希函数添加秘密(如隐藏密钥或隐藏功能),可以在密码中添加 pepper 。胡椒应存储在数据库中,并应保密。只要攻击者只能访问您的密码哈希值(SQL-Injection),胡椒就可以防止字典攻击,但不能访问带有密码的服务器。

答案 2 :(得分:0)

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

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

如果您的用户使用易于猜测的密码,字典攻击每天都会打败您,无法防止愚蠢。