0

当我在 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 之外,所有结果怎么可能相同?我认为盐的最轻微变化会产生完全不同的结果。

4

3 回答 3

1

在您的情况下,您使用的是标准的基于 des 的 crypt algorithm

在这种情况下,盐只作为输出的前两个字符返回,因此如果您只更改一个非常长的盐字符串中的一个字母,那么您很可能会为多个“几乎相同”的盐获得相同的字符串。

来自 PHP 手册:

http://php.net/manual/en/function.crypt.php

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

于 2012-07-16T20:23:28.453 回答
0

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

于 2012-07-16T20:43:36.113 回答
0

需要结束 $:

$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$');
于 2012-07-16T20:45:01.760 回答