14

PHPで、ハッシュで使用するためのランダムな可変長ソルトを作成する方法は何ですか?16文字の長い塩を作りたいとしましょう-どうすればいいですか?

4

4 に答える 4

60

編集: 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の範囲にある可能性があるため、保存/取得するにはバイナリセーフ関数が必要です。

于 2010-02-10T09:06:49.707 に答える
3

OS に応じて、次のようになります。

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

random と urandom の動作をよく読んでください。

他の人は md5 とハッシュの繰り返しにいくつかの問題があることを正しく指摘していますが、パスワード (つまり比較的短い文字列) のブルート フォース攻撃には、ハッシュ アルゴリズムがどれほど洗練されていても同じ時間がかかります。

C.

于 2010-02-10T09:11:09.653 に答える
2

これがランダムな文字列を生成する関数を見つけました:

/* 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;
}
于 2012-07-12T17:17:28.903 に答える
0

良い塩には2つの前提条件があります:それは長くなければならず、そしてそれはランダムでなければなりません。これを達成する方法はたくさんあります。microtimeたとえば、との組み合わせを使用することもできますがrand、塩が一意であることを確認するために、さらに長い時間をかける場合があります。

衝突の可能性はごくわずかですが、MD5または他の衝突しやすいアルゴリズムを使用してソルトをハッシュすると、理由もなくソルトが一意になる可能性が低くなることに注意してください。

編集:の代わりrand()mt_rand()。マイケルが指摘したように、それはよりも優れていrandます。

于 2010-02-10T08:55:09.310 に答える