次のコードは、どちらの方法でも同じ暗号化されたパスワードを返します。なぜ、そしてどのようにこれを止めるのか。
$pwd = 'shits8888';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
これは同じものを返しているので、明らかに何かが欠けています
$pwd = 'shits8888hjhfgnsdkjf8744884';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
標準の DES ベースの crypt() は、ソルトを出力の最初の 2 文字として返します。また、str の最初の 8 文字のみを使用するため、同じ 8 文字で始まる長い文字列は同じ結果を生成します (同じソルトが使用されている場合)。
http://php.net/manual/en/function.crypt.php
ハッシュに使用されるアルゴリズムをさらに制御したい場合は、 mcryptをご覧になることをお勧めします。
crypt()
また、 (名前にもかかわらず) は実際には文字列を暗号化せず、ハッシュを生成するだけであることにも注意してください。おそらくどこかに保存しているソルトを指定している場合は、次のようにしたほうがよい場合があります。
function my_crypt ($string, $salt) {
return sha1($string.$salt); // ...or your hashing function of choice
}
マニュアルからの参照: 標準の DES ベースの crypt() は、出力の最初の 2 文字としてソルトを返します。また、str の最初の 8 文字のみを使用するため、同じ 8 文字で始まる長い文字列は同じ結果を生成します (同じソルトが使用されている場合)。
どちらのエントリも最初の 8 文字と同じソルトを持っています。したがって、同じ結果を返す必要があります。
例えば:
echo crypt('12345678xxxxx','50153fc193af9');
echo crypt('12345678yyyyyy','50153fc193af9');
50gyRGMzn6mi6
同じソルトと同じ最初の 8 文字を共有しているため、両方とも返されます。
すべての暗号化アルゴリズムには制限があり、md5 でさえある時点で繰り返されます。