当我在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/>';
我得到以下结果:
hash1: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6
<br/>
hash2: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6
<br/>
hash3: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6
<br/>
hash4: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6
<br/>
hash5: $2a$08$useasillystringforsalOnUtWGdo1WqxrpPXy7Lrt0SHVxn5XeU6
<br/>
hash6: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6
hash1是以下结果:
crypt('test',$2a$08$useasillystringforsalt);
我的问题是:
除了hash5之外,所有结果如何都一样?我以为 盐的微小变化会产生完全不同的结果。
答案 0 :(得分:1)
在您的情况下,您使用的是标准的基于des的加密算法。
在这种情况下,salt只作为输出的前两个字符返回,所以如果你只改变一个很长的盐字符串中的一个字母,你很可能会得到多个“几乎相同”的盐的相同字符串
从PHP手册:
http://php.net/manual/en/function.crypt.php
标准的基于DES的crypt()将salt作为前两个返回 输出的字符。它也只使用前八个字符 str,所以更长的字符串以相同的八个字符开头 将产生相同的结果(当使用相同的盐时)。
答案 1 :(得分:0)
原来,由于某种原因,它只是忽略了最后一个角色。多么愚蠢的实施。可能没什么值得担心的。没有合理的方法可以将安全性提高到超过盐长度限制所施加的限制。
答案 2 :(得分:0)
需要结束$:
$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$');