17

典型的なPHPインストールにめったに含まれないライブラリに依存せずに、PHPで暗号的に安全な32バイトのソルトを生成する最良の方法は何ですか?

グーグルで調べたmt_randところ、十分に安全とは見なされていないことがわかりましたが、代替案は見つかりませんでした. ある記事では、からの読み取りを提案しまし/dev/randomたが、これは Windows では機能しません。また、非常に遅いです。

セキュリティと速度の適度なバランスが必要です (つまり、/dev/random通常のように 512 バイトを生成するのに 20 秒もかからないようにする必要があります) 。

4

8 に答える 8

9

: mcryptPHP 7.1 で非推奨になりました。最新の回答にスキップしてください。

のドキュメント (およびコメント) を参照してmcrypt_create_iv()ください。

于 2010-03-25T07:41:09.900 に答える
8

mcryptPHP7.1では非推奨になりました。最新の回答にスキップしてください。

mycrypt_create_iv()PHPバージョン5.3以降、この関数を使用できます。これは、Windowsサーバー(Unixだけでなく)でもランダムソースを使用します。使用する前に、定数MCRYPT_DEV_URANDOMが定義されているかどうかを確認する必要があります。

mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);

ランダムとは異なり、利用可能なエントロピーが十分でない場合、urandomはサーバーをブロックしません。パスワードソルトは一意である必要があるため(必ずしもランダムである必要はありません)、urandomは私にとって良い選択のようです。

于 2012-08-24T15:51:37.603 に答える
3

uniqueidも基づいているため、ランダムな文字列の生成には適していませんmicrotime。一般に、CPU サイクルはマイクロタイムティックよりもはるかに短いため、ループ内の特定の変数が一定になる可能性があります。2 番目のパラメーター「エントロピー」を true に設定し、

 uniqid('', true)

ランダム性が向上します。

ほとんどの文字セットと互換性のあるランダムな文字列を取得するには、base64 エンコーディングをmcrypt初期化ベクトル関数に適用できmcrypt_create_ivます。

$length = 16;
base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM))
//> hlZuRJypdHFQPtI2oSFrgA==
strlen(base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM)))
//> 16

character-alphabet を 2^6Bit に減らすと、上記で説明したサイズが大きくなります。

于 2013-09-19T15:57:48.537 に答える
1

から読み取る/dev/urandomか、 を使用しますopenssl_random_pseudo_bytes()

于 2012-08-03T16:48:57.183 に答える
-2

この目的にはuniqid()で十分です。

于 2010-03-25T08:04:48.050 に答える
-7

microtime()十分だと思います。

奇妙なことに、私はまだこの回答に反対票を投じています。

私が得た唯一の説明は、マイクロタイムは予測可能だということです。
塩は常に公然と知られていると想定されているため、私には奇妙に聞こえます-したがって、予測はまったく役に立ちません。

于 2010-03-25T07:35:58.940 に答える