PHPで、ハッシュで使用するためのランダムな可変長ソルトを作成する方法は何ですか?16文字の長い塩を作りたいとしましょう-どうすればいいですか?
4 に答える
編集: mcrypt 拡張機能は廃止されました。新しいプロジェクトについては、
random_bytes ( int $length )
とナトリウム(php 7.2 コア) 拡張を見てください。
mcrypt 拡張機能が利用可能な場合は、単純にmcrypt_create_iv (size, source)を使用してソルトを作成できます。
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);
「文字列」の各バイトは0〜255の範囲にある可能性があるため、保存/取得するにはバイナリセーフ関数が必要です。
OS に応じて、次のようになります。
$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);
random と urandom の動作をよく読んでください。
他の人は md5 とハッシュの繰り返しにいくつかの問題があることを正しく指摘していますが、パスワード (つまり比較的短い文字列) のブルート フォース攻撃には、ハッシュ アルゴリズムがどれほど洗練されていても同じ時間がかかります。
C.
これがランダムな文字列を生成する関数を見つけました:
/* random string */
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
良い塩には2つの前提条件があります:それは長くなければならず、そしてそれはランダムでなければなりません。これを達成する方法はたくさんあります。microtime
たとえば、との組み合わせを使用することもできますがrand
、塩が一意であることを確認するために、さらに長い時間をかける場合があります。
衝突の可能性はごくわずかですが、MD5または他の衝突しやすいアルゴリズムを使用してソルトをハッシュすると、理由もなくソルトが一意になる可能性が低くなることに注意してください。
編集:の代わりrand()
にmt_rand()
。マイケルが指摘したように、それはよりも優れていrand
ます。