【问题标题】:What is currently the most secure one-way encryption algorithm?目前最安全的单向加密算法是什么?
【发布时间】:2011-01-20 17:41:16
【问题描述】:

众所周知,单向加密是一种在数据库中加密用户密码的便捷方式。这样,即使是数据库的管理员也无法知道用户的密码,而是必须猜测密码,使用相同的算法对其进行加密,然后将结果与数据库中的加密密码进行比较。这意味着找出密码的过程需要大量的猜测和强大的处理能力。

看到计算机速度越来越快,而数学家仍在开发这些算法,我想知道考虑到现代计算能力和加密技术,哪一个是最安全的。

多年来,我几乎一直只使用 MD5,我想知道是否还有其他事情要做。我应该考虑使用不同的算法吗?

另一个相关问题:对于这样的加密密码,字段通常应该多长时间?我必须承认我对加密几乎一无所知,但我假设 MD5 哈希(例如)可以更长,并且可能需要更多的处理能力来破解。或者字段的长度根本不重要,只要加密的密码首先适合它?

【问题讨论】:

  • 哈希函数不是加密函数。加密函数具有反函数来解密加密值以获得原始值。但是哈希无法解密。只能找到冲突(导致相同哈希值的输入值)。
  • 任何给定哈希函数/算法的输出总是相同的长度。对于 MD5,无论输入位/字节/字符串的长度如何,它始终为 128 位。
  • 不用担心字段的长度。在几乎所有情况下,猜测密码并对其进行散列处理都比暴力破解要快得多,而且 128 位足够大,足以抵御暴力攻击,直到宇宙热死。
  • 要了解哈希函数的最新信息,请查看 eHash Wiki,尤其是哈希函数 Zoo ehash.iaik.tugraz.at/wiki/The_Hash_Function_Zoo

标签: algorithm security passwords md5 password-hash


【解决方案1】:

要提高密码强度,您应该使用更多种类的符号。如果密码中有 8-10 个字符,则很难破解。虽然延长它会使其更安全,但前提是您使用数字/字母/其他字符。

SHA1 是另一种散列(单向加密)算法,速度较慢,但​​摘要较长。 (编码消息)(160 位)其中 MD5 只有 128 位。

那么 SHA2 就更安全了,但它使用的更少。

【讨论】:

  • 我会注意到,在防御暴力攻击方面,速度较慢实际上是一个好处
  • 与其说“慢”不如说“即使使用专用硬件/预计算表/数学分析也很难快速...”这很重要。 NIST SHA-3 竞赛背后的基本原理是,当前的加密哈希函数虽然在通用计算机上仍然像以前一样慢,但最近由于各种其他原因被削弱了。尤其是 MD5(参见 MD5 维基百科页面)。
  • 你仍然可以彩虹表SHA1。我已将大部分新开发移至 SHA-256
  • @Xorlev 您可以为 any 哈希算法构建彩虹表。构建彩虹表的实用性取决于有多少可能的输入,而不是算法的稳健性。
  • @Xorlev:但这有什么关系呢?有了 64 位盐,怎么可能有一个 SHA-1 的彩虹表具有正确的盐值?一旦他们知道他们想要破解的密码的盐,他们就可以开始生成它,但这与对 SHA-1 的字典攻击没有什么不同。 SHA-1 彩虹表的存在不会对您构成威胁。对 SHA-1 的原像攻击可能是一个日益严重的威胁。
【解决方案2】:

给密码加盐总是一道额外的防御

$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
$hashed = md5( $userPassword . $salt );

【讨论】:

  • 重要的是每次设置密码时都要生成一个新的盐,而不是一个固定的值。
  • @caf:如果计算总是相同的,那会不会仍然使计算花费更多时间,从而增加暴力破解所需的时间? - 如果盐每次都不同,它必须与密码存储在同一行中,以便登录机制能够将散列尝试与真实密码进行比较。
  • 如果盐值始终相同,攻击者可以 a) 并行暴力破解所有密码(每个测试哈希可以与所有密码哈希进行比较); b) 在查看数据库之前计算哈希值。是的,盐应该与散列一起存储——这正是 UNIX 风格的密码散列所做的。
  • 实际上,虽然每次最好使用不同的盐,但事实证明即使使用固定盐也是有用的,只要不是世界上所有系统都使用相同的固定盐。加盐的目的是防止像 rainbow tables 这样经常用于破解 Windows 密码的预计算表。因此,如果您的盐与其他人的盐不同,它仍然有用。另请参阅Wikipedia on salting
  • 不使用 salt 的主要问题是,如果 10 个用户的密码完全相同,那么所有 10 个用户的 $hashed 完全相同。所以你刚刚破解了 10 个帐户(假设你可以看到数据库中的内容。)
【解决方案3】:

好问题! This page 是一本好书。特别是,作者声称 MD5 不适合散列密码:

问题在于 MD5 速度很快。它的现代竞争对手也是如此,例如 SHA1 和 SHA256。速度是现代安全散列的设计目标,因为散列是几乎每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上按需执行。

速度正是您在密码哈希函数中所不想要的。

文章接着解释了一些替代方案,并推荐Bcrypt作为“正确的选择”(他的话,不是我的话)。

免责声明:我根本没有尝试过 Bcrypt。认为这是一个友好的建议,但不是我可以用我自己的技术经验支持的。

【讨论】:

  • 作者还推荐了为 FreeBSD 开发的密码哈希方案,它以 MD5 为核心,但对哈希函数进行了数千次迭代。 glibc 中有一个基于 SHA-1 的类似结构。
【解决方案4】:

NIST 目前正在举办一场比赛,以选择一种新的哈希算法,就像他们选择 AES 加密算法一样。所以几年后这个问题的答案可能会有所不同。

您可以查看提交的内容并自己研究它们,看看是否有您想要使用的。

【讨论】:

    【解决方案5】:

    警告:自从这篇文章写于 2010 年以来,GPU 已被广泛用于暴力破解密码哈希。价格适中的 GPU 每秒可以运行 100 亿 个 MD5。这意味着即使是 完全随机的 8 位字母数字密码(62 位可能 字符)可以在 6 小时内被暴力破解。 SHA-1 只是稍微 慢一点,一天就可以了。您的用户密码要弱得多,并且 (即使加盐)将以每人数千个密码的速度下降 第二。散列函数设计得很快。你不想要这个 用于密码。使用 scrypt、bcrypt 或 PBKDF-2。

    MD5 在 1996 年被发现是弱的,should not be used anymore 用于加密目的。 SHA-1 是常用的替代品,但has similar problems。哈希函数的SHA-2 family 是SHA-1 的当前replacement。 SHA-2 的成员分别称为 SHA-224、SHA-256、SHA-384 和 SHA-512。

    目前,几个哈希函数are competing to become SHA-3,下一个标准化的加密哈希算法。将在 2012 年选出获胜者。这些都不应该使用!

    对于密码散列,您也可以考虑使用bcrypt 之类的东西。它的设计速度足够慢,以使大规模暴力攻击不可行。您可以自己调整慢速,这样当计算机变得更快时,它可以变慢。

    警告: bcrypt 基于较旧的双向加密算法 Blowfish,目前存在更好的替代方案。我不认为 bcrypt 的加密散列属性被完全理解。如果我错了,请有人纠正我;我从来没有找到一个可靠的来源从密码学的角度讨论 bcrypt 的属性(除了它的缓慢性)。

    冲突风险对于密码散列的重要性不如对公钥加密或数字签名的重要性,这可能有点令人放心。今天使用 MD5 对于 SSL 来说是 terrible idea,但对于密码散列来说并不是同样灾难性的。但是,如果您有选择,只需选择一个更强大的。

    使用良好的哈希函数是not enough 来保护您的密码。您应该将密码与长的saltscryptographically random 一起散列。如果可能,您还应该帮助您的用户选择更强的密码或密码短语。越长越好。

    【讨论】:

    • “越长越好”。不是必然为真。我听说过一些传闻,强迫用户选择更长的密码有时会导致他们选择具有 less 熵的密码,以便他们能够记住它们。如果我每天使用它,我个人可以记住一个 8 字母随机生成的密码。再长一点,我会自己编密码,我不知道这些密码的熵是多少。
    • @Steve 攻击者不会逐渐从低熵密码尝试转移到高熵密码尝试。他们尝试字典攻击,然后是蛮力。因此,“ooGoo!ooooooo876”的熵低于“d!NA0sue732bnfuw”,但同样安全。
    • 对于密码散列,MD5 仍然应该被认为是一个合理的选择(正如你所暗示的那样),前提是你的密码很强大并且你使用了盐(这将适用于任何散列)。据我了解,冲突攻击在很大程度上与密码哈希无关。
    • @Lucas:“ooGoo!ooooooo876”和“d!NA0sue732bnfuw”都没有相关含义的熵,因为它们是常数而不是随机变量。为了迂腐,我应该说“选择密码作为熵较少的 r.v 的输出”,而不是“选择熵较少的密码”。低熵密码生成方案更有可能生成属于字典/蛮力攻击的早期部分的密码,假设(为了安全起见)攻击者对密码的选择方式有一定的了解并拥有明智地设计了他的攻击。
    • @molf 我在警告中编辑了关于 MD5、SHA-1 等使用 GPU 的暴力破解速度有多快,以及这意味着密码存储不再可以接受这些。请随时更改/恢复/等。
    【解决方案6】:

    看到计算机越来越快,而数学家仍在开发这些算法

    RSA 加密是安全的,因为它依赖于一个非常大的数字,难以 分解。最终,计算机将变得足够快,可以在合理的时间内计算出这个数字。为了保持领先地位,您可以使用更大的数字。

    但是,对于大多数网站来说,散列密码的目的是让有权访问数据库的人读取密码不方便,而不是提供安全性。为此,MD5 很好1

    这里的含义是,如果恶意用户获得了对整个数据库的访问权限,他们就不需要密码。 (前门的锁不会阻止我进入窗户。)


    1 仅仅因为 MD5 被“损坏”并不意味着您可以随时反转它。

    【讨论】:

    • “但是,对于大多数网站来说,散列密码的目的是让有权访问数据库的人不方便读取密码,而不是提供安全性。” - 这可能是大多数网站实现的全部,但其目的应该是使撤销任何用户存储的密码变得不切实际 - 这样做是完全可以实现的。
    • 同意,我已经强烈尝试向我的同事解释为什么 MD5 的弱点不应排除其用于密码散列。不用说,使用盐和最小密码强度仍然是可取的
    • 我同意,如果他们拥有您的整个数据库,他们不需要用户密码即可进入您的系统,但由于很多人重复使用他们的密码,因此忽略强哈希算法 + salt 的重要性。
    • 确实如此。并且(差不多 9 年后)我认为现在是从简单的 MD5 继续前进的时候了,实际上,一般来说,密码。不起眼的用户名和密码仍有很多实用性,但我期待生物识别和易于使用的第二因素成为一种实用且安全的身份验证方式的那一天。
    【解决方案7】:

    除了作为加密安全的单向函数之外,用于密码保护的良好哈希函数应该难以暴力破解 - 即设计缓慢。 scrypt 是该领域最好的之一。从主页:

    我们估计,在现代(2009 年)硬件上,如果花费 5 秒计算派生密钥,则针对 scrypt 的硬件暴力攻击的成本大约是针对 bcrypt 的类似攻击成本的 4000 倍(至找到相同的密码),并且比针对 PBKDF2 的类似攻击大 20000 倍。

    也就是说,从常用的哈希函数中,对 SHA 系列中的任何内容进行几千次迭代对于非关键密码的保护是相当合理的。

    此外,请始终添加盐,以防止一次暴力破解多个哈希的努力。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多