Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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_Crypt - Fatal编程技术网

PHP加密函数结果:它是如何工作的?

PHP加密函数结果:它是如何工作的?,php,crypt,Php,Crypt,在PHP中执行下一个脚本时: $hash1 = crypt('test','$2a$08$useasillystringforsalt$');<br/> echo 'hash1:'.$hash1.'<br/>'; $hash2 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6');<br/> echo 'hash2: '.$hash2.'

在PHP中执行下一个脚本时:

 $hash1 = crypt('test','$2a$08$useasillystringforsalt$');<br/>
   echo 'hash1:'.$hash1.'<br/>';
   $hash2 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6');<br/>
   echo 'hash2: '.$hash2.'<br/>';      
   $hash3 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6');
<br/>
   echo 'hash3: '.$hash3.'<br/>';   
   $hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
<br/>
   echo 'hash4: '.$hash4.'<br/>';   
   $hash5 = crypt('test','$2a$08$useasillystringforsaldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
<br/>
   echo 'hash5: '.$hash5.'<br/>';   
   $hash6 = crypt('test','$2a$08$useasillystringforsaleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
<br/>
   echo 'hash6: '.$hash6.'<br/>';
我的问题是:

除了hash5,所有的结果怎么可能是相同的?我以为
盐的细微变化会产生完全不同的结果

在您的案例中,您使用的是标准的基于des的加密算法

在这种情况下,salt仅作为输出的前两个字符返回,因此,如果在一个很长的salt字符串中只更改一个字母,则很可能在多个“几乎相同”的salt中得到相同的字符串

从PHP手册:

标准的基于DES的crypt()返回salt作为前两个 输出的字符。它也只使用前八个字符 对于str,因此以相同的八个字符开头的更长字符串 将产生相同的结果(使用相同的盐时)


事实证明,它只是出于某种原因忽略了最后一个字符。多么愚蠢的实现。可能没什么好担心的。没有合理的方法可以将安全性提高到超过盐长度限制所施加的限制。

需要结束$:

$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$');

嗯。。。打扰一下这句话违背了各种密码原理。请给我推荐信。好的,我真的很困惑。那么这两份盐是什么呢?是“我们”吗。那么字符串中的salt在哪里?散列密码从哪里开始?@Crontab他在他的示例中使用的是标准密码,不是吗?@downvoter-除了不理解用户问题之外,还有什么理由进行向下投票吗?@Crontab可以解释一下“salt只作为输出的前两个字符返回”和“返回盐作为输出的前两个字符"? 也许我错过了什么。我没有说过它使用salt中的两个字符,但是salt作为两个字符返回。根据crypt文档,crypt只关心salt的前22位数字。也就是说,我不知道为什么它不会出现different@user1529858试试这个。post results实际上它返回一个yes,所以我猜是使用了河豚。关于美元符号,您是对的,但结果仍然是一样的。可能它将空终止符视为字符串的一部分(这将是一个bug)。尝试更改第21个字符。更改第21个位置会产生奇怪的结果:$hash4=crypt('test','$2a$08$useasillystringforsald$)
回显“hash4:”.$hash4.

哈希4:$2a$08$uselystringforsalonutwgdo1wqxrppxy7lrt0shvxn5xeu6使用ASILystring
哈希5:$2a$08$uselystringforsaley3tiruwcapaejcvzqfycritqtapur6
哈希6:$2a$08$uselystringforsaley3tiruwcapaejcvjzqfycritqtapur6$hash5=crypt('test','2a$08$uselystringforsale$)
回显“hash5:”.$hash5.
$hash6=crypt('test','2a$08$useasillystringforsalf$)
作为零索引字符串,我指的是第20个字符。
crypt('test',$2a$08$useasillystringforsalt);
$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$');