2011-12-22 177 views
3

一段时间以来,我一直在寻找一种更安全的方法来在我的网站上散列用户密码,以便将其插入到数据库中。我研究了所有可用的散列方法。据说bcrypt是最好的,因为它的速度很慢。我在想,如果我不需要最高的安全性,但仍然保持安全。如果我使用sha512,然后在该散列上使用md5,该怎么办?如果我颠倒了哈希的顺序,会有关系吗?请记住,我将为每项操作使用单独的盐。这会有多安全?有没有其他组合可以做同样的事情?SHA512和MD5哈希

回答

5

您发明的任何自定义方法都更容易产生微妙的错误,这些错误会使您的存储方法受到攻击。这是不值得的努力,因为你不可能找到这些微妙的错误,直到为时已晚。使用经过尝试和测试的东西要好得多。

一般来说,这些都是你的选择保存密码时,

  • 使用bcrypt
  • 使用腌制,加强的散列。

第一种方法很简单,就是使用bcrypt。它几乎支持任何语言,并且已被广泛使用和测试以确保其安全性。

第二种方法要求您使用通用散列函数(SHA-2系列或更高版本,而不是MD5或SHA-1,如they're broken/weak)或更好,HMAC为用户创建独特的盐,然后迭代散列函数多次(100,000等)以使其减慢(称为key stretching/strengthening)。

例如(伪)

sofar = hash("sha512", user_salt + site_salt + input_password); 
iterations = 100000; // Should be changed based on hardware speed 
while (iterations > 0) 
{ 
    sofar = hash("sha512", user_salt + site_salt + sofar); 
    iterations--; 
} 
user.save("password", "$sha512$" + user_salt + "$" + iterations + "$" + sofar); 

每次迭代应该依靠先前的迭代所以有人不能并行蛮力方法来打破它。同样,迭代的次数应该根据硬件的速度进行更改,以便过程足够慢。当涉及到密码散列时,速度越慢越好。

摘要
使用bcrypt

+0

好的,我会用bcrypt。谢谢您的帮助! – Sneitzke38

2

我根本没有看到使用MD5的意义。它坏了。但多轮显然更强。然而,两轮的改善不会有太大的区别。多次应用SHA512会更好。

而应该寻找在用户密码长度和腌制的密码,如果你没有这样做

Is "double hashing" a password less secure than just hashing it once?提供了多轮的算法的详细解说。

实际上,我怀疑破解的SHA-512密码的数量很少,还有更重要的事情需要担心,比如阻止他们首先看到密码 - 确保您的系统免受SQL注入的攻击,特权升级等。

+0

哈哈,你打我吧。这篇文章是一个很好的文章。 – Dessus

+0

这听起来像个好主意。谢谢! – Sneitzke38