【问题标题】:Multiple Salts to protect passwords多种盐来保护密码
【发布时间】:2012-10-05 19:45:43
【问题描述】:

如果您在对密码进行哈希处理之前使用盐 - 它会使哈希更安全。这是有道理的,因为彩虹表攻击变得更加困难(不可能?)。

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

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

例子:

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

【问题讨论】:

  • Rainbow table 攻击变得更加困难,哈希并不能让你免受字典攻击。

标签: security hash passwords salt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我仍然不相信能将你从字典攻击中拯救出来的辣椒
    • @Woot4Moo - 到目前为止,您是对的,它只能防止某些类型的攻击。
    【解决方案3】:

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

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

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

    【讨论】:

    • 不确定哈希与加密哈希是什么意思,为了存储密码,您需要加密哈希。如果有已知的碰撞方式,则哈希被认为是损坏的,这比暴力破解更快。当然,正如您正确指出的那样,MD5 太快了。盐不是秘密,没必要隐瞒,要加秘密,就加胡椒。我不会把盐和胡椒混合在一起,因为它们有不同的目的。在某些情况下,胡椒可以防止弱密码(SQL 注入)。
    • @martinstoeckli 你有一篇研究论文说辣椒可以防止弱密码吗?根据我对零意义的辣椒的理解。有两类散列,普通散列 (MD5) 和加密散列 (SHA)。 MD5 没有任何问题,而且碰撞的“轻松性”并不像末日预言者所说的那么高。如果我要存储密码,我会推荐一个加密哈希,但基本上 MD5 是好的,世界上所有的哈希都不会让你免于糟糕的密码。
    • 辣椒只能防止字典攻击,如果攻击者没有可以控制服务器(以及因此带有密码的代码)。如果攻击者成功使用 SQLInjection,通常就是这种情况。您将辣椒添加到(弱)密码中,因此您实际上是在散列“12345ai8-9?uz3dWe”而不是“12345”,并且您不会在任何字典中找到。
    • 顺便说一下,您建议的迭代是通过密钥派生函数解决的,请参阅 PBKDF2。对于 PBKDF2,甚至可以使用 MD5,但不推荐。
    • @martinstoeckli 我的印象是提供给辣椒的输入总是相同的(假设哈希+盐)提供给辣椒函数。输出总是一样的,我想我在这里遗漏了一些关键的东西。
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2015-01-04
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多