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

あなたの場合、標準のデスベースの暗号化アルゴリズムを使用しています

この場合、ソルトは出力の最初の 2 文字としてのみ返されるため、非常に長いソルト文字列で 1 文字だけを変更すると、複数の「ほぼ同じ」ソルトに対して同じ文字列が得られる可能性が非常に高くなります。

PHPマニュアルから:

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

標準の DES ベースの crypt() は、ソルトを出力の最初の 2 文字として返します。また、str の最初の 8 文字のみを使用するため、同じ 8 文字で始まる長い文字列は同じ結果を生成します (同じソルトが使用されている場合)。

于 2012-07-16T20:23:28.453 に答える
0

$を終了する必要があります:

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

結局のところ、何らかの理由で最後の文字を無視しているだけです。なんと愚かな実装でしょう。おそらく心配することは何もありません。ソルトの長さの制限によって課せられた制限を超えてセキュリティを高める合理的な方法はありません。

于 2012-07-16T20:43:36.113 に答える