2

多くのコードは、ある種のシークレットを生成するために次のようなことを行います。

sha1(random())

単純に乱数を使用しないのはなぜですか? 過去に、一部の OS ランダム ジェネレーターがそれほど優れていなかったことは認識していますが、それが今でも正しいかどうかはわかりません。

4

3 に答える 3

3

ほとんどの場合、ハッシュ関数がエンコーディング関数として誤用されていると思います。特定の長さの英数字コードが必要であり、ハッシュはそのような文字列を提供します。それは簡単で、予測不可能に見えます。

のランダムな部分が md5 の 32 個の 16 進文字ではないことを忘れがちです。代わりに、関数が提供md5(random())するのと同じ数の可能な結果しかありません。random()ランダム関数がどのように機能するかを知っていれば、可能な値の範囲を事前に計算できます。

OSのランダムソースを実際に使用し、必要と思われるだけのバイト数を要求した場合、コードはよりランダムになります(エントロフィが向上します)。これらのバイトは、 のような関数でエンコードできますbase64_encode()。トークンの場合、base62 エンコーディングは非常にコンパクトで、特殊文字を返さないので理想的ですが、実装は少し難しいです。

あなたの質問に答えるには:乱数の方が良いでしょうが、「本当に」ランダムでなければなりません。「0」から「9」のみの英数字として使用すると、トークンが長くなり、エンコード機能で短くすることができます。

于 2013-04-26T09:16:10.723 に答える