PHP crypt功能结果:它是如何工作的?

时间:2012-07-16 20:19:59

标签: php crypt

当我在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之外,所有结果如何都一样?我以为 盐的微小变化会产生完全不同的结果。

3 个答案:

答案 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$');