使用MD5散列保护敏感数据的密码是否安全?

时间:2011-06-15 21:34:29

标签: md5 security hash

我和这个安全人员一直在讨论。他可能是我为新项目付出的最多钱。无论如何,它是一种保存用户可以通过电话请求的敏感数据(密码,PIN)的服务。用户有一个密码(4位数),用于访问敏感数据。安全人员告诉我他将使用MD5来散列用于访问敏感数据的密码。在这里,讨论开始,正如我所想,并且非常肯定,MD5太脆弱了,因为它已经被破解/碰撞。

应该使用什么散列方法来散列保护敏感信息的密码?我觉得这项服务可能成为黑客的高价值目标,所以我真的很担心。我开始担心安全人员要提供的整体质量,特别是服务的安全性,但不知道在哪里可以找到其他人。

5 个答案:

答案 0 :(得分:5)

我在这里看到了很多问题。

首先,如果一个四位数的密码阻止访问您的超级敏感数据,那么您就遇到了麻烦。我希望有其他安全措施,因为用手蛮强迫10,000组合是微不足道的,更不用说某种脚本了。

其次,我不确定你是否理解哈希密码的重点。我怀疑你只会从10,000种可能性中得到一个哈希冲突,但是当密码被暴力破解时,这基本上是无关紧要的。您正在完成的只是对具有数据库读取权限的人进行了一些混淆。

第三,密码哈希算法的需求与其他哈希算法的需求不同。您需要算法缓慢,这通常意味着必须重复运行它,并且您需要有盐,以便无法从查找表派生密码。据说,Blowfish并不坏。我发现PostgreSQL的pgcrypto文档有很好的解释。

答案 1 :(得分:2)

虽然MD5已损坏,但这些漏洞不会影响密码散列。所以MD5而不是更好的哈希函数不是这里的问题。我仍然建议使用更好的哈希函数。

通常使用某种方法来慢速哈希并添加一个盐。检查Wikipedia on Key Deriviation Functions。 PBKDF2和bcrypt是KDF的热门选择。

但我认为无法保护4位数密码。只有10,000个不同的密码。这对暴力来说是微不足道的。即使是盐和KDF也无济于事。

使用低熵PIN的系统依赖于检查服务器/硬件永远不会受到损害。因此,他们可以在几次错误尝试后锁定攻击者。但是如果攻击者获得了密码哈希的访问权限,你就无法做到这一点。

答案 2 :(得分:1)

考虑一下,为什么要哈希密码?因为即使您的数据库被盗,入侵者也无法根据哈希找到密码。但是:如果您的密码空间是4位数(10000种组合),那么找到与给定MD5哈希相匹配的密码需要多长时间?一毫秒?使用任何现代哈希函数都会遇到相同的安全漏洞(MD5现在不被认为是安全的)。

你需要的是用很长的盐腌制。为每个用户创建一些随机数据(称为 salt )和计算哈希(密码+盐)。你显然没有存储密码,但你会为每个用户存储哈希和盐。第二个想法:盐的4位密码仍然不安全 - 你得到的只是入侵者必须暴力 - 每个用户强制使用密码,但是使用10K密钥空间,这仍然是微不足道的。我不知道任何其他方法可以保护这么短的密码。

答案 3 :(得分:0)

是的,MD5严重受损。我建议你使用PBKDF2功能,这将提供更好的安全性。

MD5 security

PBKDF2 Wikipedia article

我建议使用比4位数字更强的密码。

答案 4 :(得分:0)

根据风险,有一种简单的方法可以解决这个问题。

根据定义,风险是不良事件的危险时间概率。在这种情况下,您担心MD5哈希被破解的可能性,这当然很重要。但是如果PIN长度只有4位数,那么在一次尝试中直接暴力攻击成功的概率只有10 -4 ,所以根据数据的值,你很快就会到达不良风险。

在任何情况下,在一次试验中破解MD5的概率很可能远小于10 -4 ,所以他可能是正确的。