我应该对表中的密码字段使用什么; MD5还是SHA1?

时间:2010-06-17 16:54:39

标签: c# .net cryptography md5 sha1

我绝不是安全专家,甚至不是新手。我最好是安全新手。

有人建议我使用SHA1而不是MD5 - 为什么我会选择一个而不是另一个?一个人更安全吗?

7 个答案:

答案 0 :(得分:10)

我至少会使用SHA2(256) - 但是:

由于rainbow table攻击,在数据库中简单地散列密码几乎没有意义。同样,盐渍哈希更好,但如果有人可以访问您的数据库,那么他们可能有权访问您的代码,在这种情况下,他们可能会拆解固定的盐。同样,如果你使用随机盐,那么无论如何你都要将它存储在行内,所以当它减慢人们的速度时,他们仍然可以用彩虹表攻击它。

更好的解决方案是使用Password Stretching,它使用随机盐以及随机(高)次迭代次数,因此尝试对每个密码进行暴力攻击需要的时间要长得多,因此会使其更加困难破解所有密码。

我相信.Net这可以通过PBKDF来实现 - 但是我错误地给了它一个链接(有人向我提供了我刚才问过的一个问题的答案)。 编辑 - 找到.Net 的链接:Rfc2898DeriveBytes Class

在MD5上

虽然其他答案中提到的MD5确实被证明是“破碎”,但我不会使用它的主要原因 - 以及为什么我读到它不建议使用它 - 是因为它实际上非常快速,从而增加在给定时间内裂缝的可能性。

答案 1 :(得分:3)

MD5和SHA1都被认为是不安全的,SHA-1更好。但是,您应该考虑以下两件事:

  1. 通过“不安全”,他们的意思是说它在数学上比蛮力更容易确定预先散列的值。有时这意味着他们可以将其从十亿次计算减少到9亿次,有时则显着减少。这远不如我的观点#2那么不安全。

  2. 因为您正在创建哈希,所以黑客很容易通过填充一个充满常用密码的表并通过相同的哈希算法运行它来确定数据库的密码,无论您使用哪一个。这被称为彩虹表。

  3. 例如,很多人使用“密码”和“约翰”作为密码。在MD5中,这两个密码始终生成: 密码:5f4dcc3b5aa765d61d8327deb882cf99 约翰:527bd5b5d689e2c32ae974c6229ff785

    因此,如果你只是MD5你的密码,并且某人天真地设置了他们的密码,如果黑客控制你的数据库并将其运行在彩虹表上,它可能会受到损害。

    但是,如果你为每个预先散列的值添加某种乱码,例如“password12345”和“johnxyz”,那么你会获得两个完全不同的哈希,这些哈希值与上面的哈希值不同。这称为盐值,它可以防止彩虹表生效。

    我的建议是使用您编程语言中最高级别的SHA算法,并根据盐值进行哈希(如果您愿意,可以通过哈希当前时间创建“随机”)使用散列密码存储在数据库记录中。

    数据库列:用户名|密码|盐

    这不是任何人都曾想过的最安全的系统,但它可能对你有用。

答案 2 :(得分:1)

无论你使用哪种,都要使用盐渍哈希。

祝你好运。

答案 3 :(得分:1)

存储便宜且处理器速度快。使用1千字节盐和SHA-512。

答案 4 :(得分:0)

答案 5 :(得分:0)

MD5已被“破坏”,现在更高级别的安全性需要SHA-2。这是一个非常有趣的读物http://en.wikipedia.org/wiki/MD5

编辑:迟到9秒:)

答案 6 :(得分:-1)

SHA2。 Scheier也有一些新的alternatives