这个哈希有多安全? (PHP)

时间:2011-03-06 09:07:33

标签: php security hash

function oneWayEncrypt($string) { 
    $salt = md5($string."yHuJ@8&6%4#%([@d-]"); 
    $salt2 = md5($string."@!#&+-)jU@[yT$@%"); 

    $string = hash('sha512',"$salt$string$salt2"); 

    return $string; 
} 

3 个答案:

答案 0 :(得分:15)

使用SHA-512是获得加密强哈希的好主意,但是您选择的盐并不会增加额外的安全性。特别是,如果盐的值是随机的并且不能提前预测,则盐只是好的。这可以防止攻击者预先计算用于尝试攻击数据库的已知哈希表。如果盐是已知的,则攻击者可以预先计算哈希值的表,其中盐是硬编码的。

在您的情况下,攻击者基本上知道salt,因为它是根据输入字符串确定性计算的。如果我想攻击你的系统,我可以迭代一堆已知的字符串,(确定地)计算每个字符串的salt,然后计算盐渍字符串的SHA-512哈希并将其存储在表中。从这里,我可以将哈希值反转为我预先计算的任何字符串的密码。

如果您想要更好的安全系统,请考虑使用随机生成的盐,然后将其与生成的哈希一起存储。这样,无论我预先计算哪些表格,表格都很有用,因为我不一定会为所有可能的盐计算表格。从本质上讲,盐中的每个随机位都会使我必须完成的工作量增加一倍,所以如果你选择一个好的随机盐(比如128位),那么我就没有可行的方法可以进行预计算攻击。我必须攻击SHA-512,一个假定为加密安全的哈希(名称的意思是“安全哈希算法”),以破坏你的系统。

答案 1 :(得分:4)

的安全性如何?

用于存储散列密码? - 使用随机盐,每个密码都不同。

签署Cookie? - 使用HMAC,一种基于哈希的消息认证码。

你说你想用它来存储数据库和cookie中的密码,这两者都应该使用其他经过验证的技术来完成,见上文。不要试图重新发明轮子。

当你问到某些东西是多么安全时,你不仅要知道你将使用它的方式,还要知道你希望它对哪种攻击是安全的。事情在真空中并不安全。

另外,不要因为它有更多位而假设SHA-512更适合您的应用程序。阅读Yu Sasaki,王磊和Kazumaro Aoki(PDF)的41步SHA-256和46步SHA-512的Preimage攻击论文,看看对于某些应用,一些较短的哈希实际上可以更安全比SHA-256和SHA-512,因为没有已知的前映像攻击会像SHA-256和SHA-512一样制造这么多轮。

答案 2 :(得分:2)

虽然SHA-512一般是加密哈希函数的理想选择,但它仍然可能太容易计算:SHA-512 is computationally fast enough to process 154 MB/s。你应better choose a cryptographic hash function that is computationally slower like bcrypt使用成本因素减慢速度。

此外,对每个散列操作使用random and unique salt并将其与散列一起存储,以便能够重现散列以进行比较。