【问题标题】:Is MD5 still considered secure for single use authentications?MD5 对于一次性身份验证仍然被认为是安全的吗?
【发布时间】:2012-11-25 06:06:03
【问题描述】:

这些天来,每个人都在抨击 MD5 在存储密码方面的问题。但是,如果我只想为可能会使用一次的东西添加一层身份验证,那又如何呢?

这只是一个假设的例子,但假设我有一个允许用户重置密码的功能。我通过电子邮件向用户发送一个链接,他们可以单击该链接来设置新的(随机生成的)密码。

我目前的想法是,我将生成一个 MD5 哈希,使用一个私有盐值和几个标识变量,并使用它来创建链接。

假设此功能的盐是“8b769a378411b705”(我对所有重置密码请求使用相同的盐)。其他识别数据是用户 ID 和已生成密码哈希的数据库 ID。

salt = "8b769a378411b705" (private)
user_id = 123
pw_id = 456
code = md5(salt + " " + user_id + " " + pw_id)

变成了

code = "692a71cd7da194145be209e40fcd3e92"

示例链接:confirm_reset_password.php?user_id=123&pw_id=456&code=692a71cd7da194145be209e40fcd3e92

鉴于 MD5 的问题,这是否被认为是安全的?我应该考虑使用另一种单向哈希,例如 SHA-1?

我一直在使用带有 SHA1 的 PBKDF2 来存储密码,我知道它的部分好处在于它的“慢”以及生成哈希需要多长时间。我可以为这样的目的生成那些更高质量的哈希,但我认为它会适得其反,因为你可以通过用(不正确的)请求轰炸服务器来轻松地让服务器瘫痪,因为每个请求都会导致大量的 CPU 工作产生哈希(特别是因为我使用了很多迭代)。似乎拥有一个“快速”的算法对于单次使用来说是好的,但我想知道 MD5 是否仍然是最佳选择。

谢谢!

【问题讨论】:

  • 我认为 md5 是可以接受的。很多人避免使用 md5 的问题是因为这种存储方式长期以来一直是标准的。因此,那里有巨大的 md5 哈希列表和匹配的密码。这样你可以在一秒钟内解密大部分密码。
  • 我的意思是在你的例子中可以接受,一次性使用

标签: security md5 sha1


【解决方案1】:

首先,MD5 被认为是不安全的原因有很多,首先,md5 的彩虹表现在非常庞大,可能覆盖了大部分哈希空间。其次,已知的攻击允许您创建哈希冲突(以产生相同 md5 输出的方式伪装其他数据)。第三,它的 128 位,今天它很短。

现在回到您的问题,如果您没有托管任何对安全至关重要的应用程序,也没有存储任何私人数据、医疗数据或任何其他“国家法律控制”的数据,那么您就可以使用 md5。进入你的算法,它不是不安全的,但它也不是超级安全的,它是你的选择。您唯一应该添加的是新鲜度,即某种时间戳,告诉您消息的有效期。其次,您的算法不提供重放保护:),如果用户将使用此链接一次并将其留在浏览器中,攻击者可能会再次使用此链接来重置此密码。这是一个相当严重的缺陷。所以你可能想要修复它。

但我想告诉你一些其他的事情。如果不是绝对必要,请勿使用 CRYPTO!我卑微的请求。您的密码重置方案可以在没有加密和重放保护的情况下轻松实施,而且安全性更高。您需要做的就是在表“pw_reset_hash”和“reset_validity”中添加额外的列,并用随机数和有效日期填充它们。给用户一个随机数,用完后清空字段,事先检查有效性。瞧 :) 因为它是随机的,它可能比任何散列算法更安全。但请使用安全的 PRNG。

【讨论】:

  • 我明白你在说什么,但也许还有其他想法。如果我忽略加密,并把随机数的东西更远一点,只生成一个 UUID(版本 4)怎么办?我可以将该值连同所有其他相关数据一起放入数据库,并让验证链接仅引用 UUID。碰撞是极不可能的(我可以在插入之前检查它),并且用蛮力找到一个有效的 UUID 也是极不可能的。处理完请求后,我会将其从数据库中删除,因此只能触发一次。更好的? tinyurl.com/avgsdrx
  • 很好 :) 如果您使用安全的 PRNG 来填充 UUID,具有足够的熵,并且如果您不关心此类 UUID 的有效期,那么您是安全的,并且没有加密 :) .
  • 确保其安全性是随机的,而不仅仅是您的普通 rand() 函数或等效函数,:D
【解决方案2】:

为什么将密码链接建立在某些东西上?这只会使它的安全性降低(因为它基于一些可能泄漏的已知数据)!在这种情况下,随机生成的代码要好得多。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2014-04-30
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多