多くのコードは、ある種のシークレットを生成するために次のようなことを行います。
sha1(random())
単純に乱数を使用しないのはなぜですか? 過去に、一部の OS ランダム ジェネレーターがそれほど優れていなかったことは認識していますが、それが今でも正しいかどうかはわかりません。
多くのコードは、ある種のシークレットを生成するために次のようなことを行います。
sha1(random())
単純に乱数を使用しないのはなぜですか? 過去に、一部の OS ランダム ジェネレーターがそれほど優れていなかったことは認識していますが、それが今でも正しいかどうかはわかりません。
ほとんどの場合、ハッシュ関数がエンコーディング関数として誤用されていると思います。特定の長さの英数字コードが必要であり、ハッシュはそのような文字列を提供します。それは簡単で、予測不可能に見えます。
のランダムな部分が md5 の 32 個の 16 進文字ではないことを忘れがちです。代わりに、関数が提供md5(random())
するのと同じ数の可能な結果しかありません。random()
ランダム関数がどのように機能するかを知っていれば、可能な値の範囲を事前に計算できます。
OSのランダムソースを実際に使用し、必要と思われるだけのバイト数を要求した場合、コードはよりランダムになります(エントロフィが向上します)。これらのバイトは、 のような関数でエンコードできますbase64_encode()
。トークンの場合、base62 エンコーディングは非常にコンパクトで、特殊文字を返さないので理想的ですが、実装は少し難しいです。
あなたの質問に答えるには:乱数の方が良いでしょうが、「本当に」ランダムでなければなりません。「0」から「9」のみの英数字として使用すると、トークンが長くなり、エンコード機能で短くすることができます。