PHP加密函数结果:它是如何工作的?
在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.'
$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$');