对于一次性身份验证,MD5仍然被认为是安全的吗?

时间:2012-12-07 03:59:52

标签: security md5 sha1

这些天来,每个人都在关注存储密码的问题。但是,我只想在可能会使用一次的内容中添加一层身份验证?

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

我目前的想法是,我将使用私有盐值和一些识别变量生成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是否仍然是最好的选择。

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

但我想告诉你一些其他的事情。如果不是绝对必要,请不要使用CRYPTO!我的谦卑要求。您的密码重置方案可以轻松实现,无需加密和重放保护,以及更高的安全性。您需要做的就是在表“pw_reset_hash”和“reset_validity”中添加一些附加列,并使用RANDOM编号和有效日期填充它们。向用户发出随机数,并在使用后清除字段,事先检查有效性。瞧:)因为它是随机的,它可能比任何哈希算法更安全。但请使用安全的PRNG。

答案 1 :(得分:2)

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