Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:迭代散列是否会使其更安全?_Php_Security_Hash - Fatal编程技术网

PHP:迭代散列是否会使其更安全?

PHP:迭代散列是否会使其更安全?,php,security,hash,Php,Security,Hash,我想知道,当与盐一起使用时,散列的过程是否有助于阻止对它的攻击(我认为是蛮力攻击)。所以我的代码是: function hash_password($password, $salt, $site_key) { $hash = hash('sha512', $password . $salt . $site_key); for ($i=0; $i<1000; $i++) { $hash = hash($hash); } return $hash

我想知道,当与盐一起使用时,散列的过程是否有助于阻止对它的攻击(我认为是蛮力攻击)。所以我的代码是:

function hash_password($password, $salt, $site_key) {
    $hash = hash('sha512', $password . $salt . $site_key);
    for ($i=0; $i<1000; $i++) {
        $hash = hash($hash);
    }
    return $hash;
}
函数哈希密码($password、$salt、$site\u key){
$hash=hash('sha512',$password.$salt.$site\u key);

对于($i=0;$i您那里的代码只是一遍又一遍地重复相同的内容。如果您在第一次迭代和最后一次迭代之后查看
$hash
,您将看到它们是相同的


这就是为什么我们只使用bcrypt之类的东西。如果你试图自己实现它,你很可能会出错:)

你在那里的代码只是一遍又一遍地重复相同的东西。如果你在第一次迭代和最后一次迭代后查看
$hash
,你会发现它们是相同的


这就是为什么我们只使用bcrypt之类的东西。如果你试图自己实现它,你很可能会做错:)

是的,它是这样做的,原因很简单。哈希是为了速度而不是安全性(因为它通常用于计算大文件的校验和)。因此,一台CPU强大的计算机(或使用GPU的黑客)可以用每秒10亿次的哈希来强制你的代码

如果你确定你的散列算法比较慢(通过对它进行1000次迭代),那么同一台计算机每秒只能执行100万次,而不是100次。因此,如果攻击者用蛮力破解密码需要60小时,那么现在需要60000小时,也就是近7年:)


但是,您的代码没有正确地实现它,您正在反复执行相同的操作,您应该对上一个哈希中得到的哈希进行哈希,并添加一些安全字符(通常是迭代索引)

while(i<1000){hash(somehash)}//错误
而(i<1000){hash=hash(hash.i)}//正确。


PHP已经为您内置了此功能!使用
crypt()
crypt\u河豚
(也称为
bcrypt
),您可以在函数中输入密码和salt,并在迭代和所有操作之后获得完成的哈希。有关详细信息,是的,它是这样做的,原因很简单。哈希是为了速度而不是为了安全(因为它通常用于计算大文件的校验和)。因此,具有强大CPU的计算机(或者使用GPU的黑客)可以以每秒10亿次的速度对你的代码进行暴力破解

如果你确定你的散列算法比较慢(通过对它进行1000次迭代),那么同一台计算机每秒只能执行100万次,而不是100次。因此,如果攻击者用蛮力破解密码需要60小时,那么现在需要60000小时,也就是近7年:)


但是,您的代码没有正确地实现它,您正在反复执行相同的操作,您应该对上一个哈希中得到的哈希进行哈希,并添加一些安全字符(通常是迭代索引)

while(i<1000){hash(somehash)}//错误
而(i<1000){hash=hash(hash.i)}//正确。



PHP已经为您内置了此功能!使用
crypt()
crypt\u河豚
(也称为
bcrypt
),您可以在函数中输入密码和salt,并在迭代后获得完成的哈希值。有关更多信息,

我看到大型公司的web应用程序安全要求指出,密码哈希循环需要执行整整一秒钟的服务器时间。我花了10000 md5次迭代来满足该要求irement.o_可能是…的副本,下面是人们不这样做的一些原因:这个循环是完全冗余的。你只需要计算1000次相同的散列。@WillVousden是我现在的代码吗?我看到大公司的web应用安全要求声明密码散列循环需要在服务器时间的整整一秒钟内执行给我10000次md5迭代来满足这个要求。可能是…的重复。下面是人们不这样做的一些原因:这个循环是完全冗余的。你只需要计算1000次相同的散列。@WillVousden是我现在的代码?如果你想挫败暴力攻击,最好使用bcrypt:kool之类的东西谢谢,我知道我的代码搞错了,我累了,哈哈,这就是我想知道的关于7年的事情xD,当用户登录时需要多长时间?散列速度要慢1000倍,这意味着大约1毫秒(即0.001秒)更长:)这会增加冲突的风险吗?不,不会。最终算法的输出是一个SHA1字符串,它将与任何其他SHA1字符串具有精确的可能结果数,因此不,不会增加冲突:)如果你想挫败暴力攻击,最好使用类似bcrypt:kool的东西谢谢我知道我得到了答案代码错误我累了哈哈这就是我想知道的关于7年的事情xD当用户登录时需要多长时间?散列速度要慢1000倍,这意味着大约1毫秒(即0.001秒)更长:)这会增加冲突的风险吗?不,不会。最终算法的输出是一个SHA1字符串,它与任何其他SHA1字符串一样具有确切的可能结果数,因此不,不会增加冲突:)@Andy-对不起,我的目的不是要挑你的代码,只是要指出,当涉及到哈希强度时对于迭代散列,已经有了一个好的解决方案(bcrypt)。试图重新发明它可能会给你留下一个更糟糕的解决方案(无论你是多么优秀的程序员)@安迪-对不起,我的意思不是真的挑你的代码,只是要指出,当涉及到用迭代哈希加强哈希时,已经有了一个很好的解决方案
while (i < 1000) { hash(somehash) } //wrong
while (i < 1000) { hash = hash(hash . i) } //correct.