1

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

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

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

例子:

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

4

3 回答 3

6

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

于 2012-10-06T07:16:31.080 回答
4

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

  1. 盐不能防止字典攻击。如果正确使用,它可以防止彩虹表。
  2. 为每个密码使用唯一的盐。盐应该是一个随机值,而不是从已知信息中得出。它必须与密码一起存储。
  3. 不要使用 MD5对密码进行哈希处理。Md5 被认为是损坏的,散列密码的速度太快了。使用现成的 GPU,您可以每秒计算 8 Giga MD5 哈希(2012 年)。这使得在不到 0.1 毫秒的时间内暴力破解大约 500000 个单词的整个英语词典成为可能!
  4. 使用Bcrypt对密码进行哈希处理。建议使用完善的库,如phpass,如果你想了解它是如何实现的,可以阅读上面的文章。

如果您想在哈希函数中添加秘密(如隐藏密钥或隐藏函数),您可以在密码中添加胡椒。辣椒应该存储在数据库中,并且应该保密。只要攻击者只能访问您的密码哈希(SQL 注入),而不能访问具有密码的服务器,辣椒就可以防止字典攻击。

于 2012-10-06T22:12:27.370 回答
0

在这种情况下,我认为多个哈希不会对您有所帮助,主要是因为当有人破坏您的数据库时,他们会注意到您有 7 种不同的盐要反对,并且可能会根据一周中的几天做出有根据的猜测。MD5 从根本上来说并没有什么问题,因为很多人都喜欢跟风。那些说 MD5 是损坏的哈希的人对哈希函数和加密哈希函数有根本的误解,我建议忽略它们。如果您需要加密哈希函数,请使用 SHA-2(或该系列或更高版本的产品)。

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

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

于 2012-10-07T14:34:44.770 回答