26

PHP には、ある種の UUID を生成するuniqid()関数があります。

使用例では、以下を示します。

$token = md5(uniqid());

しかし、コメントでは、誰かがこれを言っています

一意の ID から MD5 を生成することは単純であり、一意の ID の価値の多くを低下させるだけでなく、MD5 ドメインに重大な (攻撃可能な) 制限を提供します。それは深く壊れたことです。正しいアプローチは、一意の ID を単独で使用することです。すでに衝突しないように調整されています。

もしそうなら、なぜこれは本当ですか?MD5 ハッシュが一意の ID に対して (ほぼ) 一意である場合、uniqid を md5 化することの何が問題になるのでしょうか?

4

6 に答える 6

45

UUID は 128 ビット幅で、生成方法に固有の固有性があります。MD5 ハッシュは 128 ビット幅であり、一意性は保証されず、衝突の可能性が低いだけです。MD5 ハッシュは UUID より小さくないため、ストレージには役立ちません。

ハッシュが UUID からのものであることがわかっている場合、有効な UUID のドメインは、それらを生成するマシンについて何か知っていれば、実際にはかなり予測可能であるため、攻撃するのははるかに簡単です。

安全なトークンを提供する必要がある場合は、暗号的に安全な乱数ジェネレーターを使用する必要があります。(1) UUID は、暗号的に安全になるようには設計されておらず、一意であることが保証されているだけです。一意のマシン識別子 (通常は MAC) と時間で区切られた単調に増加するシーケンスは、依然として完全に有効な UUID ですが、トークンのシーケンスから単一の UUID をリバース エンジニアリングできれば、非常に予測可能です。

  1. 暗号的に安全な PRNG の決定的な特徴は、与えられた反復の結果には、次の反復の値を推測するのに十分な情報が含まれていないことです。つまり、ジェネレーターには、数で明らかにされず、推測できない隠れた状態があります。 PRNGからの一連の数字を調べることによって。

    数論に入ると、生成された値のシーケンスから一部の PRNG の内部状態を推測する方法を見つけることができます。 メルセンヌ・ツイスターは、そのようなジェネレーターの例です。長い期間を取得するために使用された非表示の状態がありますが、暗号的に安全ではありません。かなり小さな数列を取得し、それを使用して内部状態を推測できます。これが完了したら、それを使用して、そのシーケンスを秘密にしておくことに依存する暗号化メカニズムを攻撃できます。
于 2009-08-18T13:19:14.287 に答える
14

UUIDuniqid()を返すのではなく、現在の時刻に基づく「一意の」文字列を返すことに注意してください。

$ php -r 'echo uniqid("prefix_", true);'
prefix_4a8aaada61b0f0.86531181

これを複数回行うと、非常によく似た出力文字列が得られ、よく知っている人なら誰でもuniqid()ソース アルゴリズムを認識できます。そうすれば、次に生成される ID を簡単に予測できます。

アプリケーション固有のソルト文字列または乱数とともに、出力を md5() することの利点は、文字列を推測するのが非常に難しいことです。

$ php -r 'echo md5(uniqid("prefix_", true));'
3dbb5221b203888fc0f41f5ef960f51b

plain とは異なりuniqid()、これはマイクロ秒ごとに非常に異なる出力を生成します。さらに、「プレフィックスソルト」文字列やuniqid()、ボンネットの下で使用していることを明らかにしません。ソルトを知らなければ、次の ID を推測するのは非常に困難です (不可能だと考えてください)。

要約すると、私はコメンターの意見に同意せず、常にmd5()プレーンよりも -ed 出力を好みuniqid()ます。

于 2009-08-18T13:30:15.510 に答える
5

UUID はすでに一意で固定長 (短い) であるため、UUID を MD5ing することは無意味です。これは、最初から MD5 を使用することが多い理由の一部です。UUID をどうするかにもよると思いますが、一般的に UUID は MD5 された一部のデータと同じプロパティを持っているのに、なぜ両方を行うのでしょうか?

于 2009-08-18T13:16:08.500 に答える
2

バージョン 3の UUID は既に MD5 化されているため、再度実行しても意味がありません。ただし、PHP が使用する UUID バージョンはわかりません。

于 2009-08-18T13:23:00.680 に答える
2

UUID はすでに一意であるため、とにかく MD5 化しても意味がありません。

セキュリティの質問に関しては、一般に、次に生成しようとしている一意の ID を攻撃者が予測できる場合、攻撃を受ける可能性があります。UUID から一意の ID を生成することがわかっている場合、潜在的な次の一意の ID のセットははるかに小さくなり、ブルート フォース攻撃の可能性が高くなります。

これは、攻撃者があなたから一意の ID を大量に取得できる場合に特に当てはまり、その方法で UUID を生成するスキームを推測できます。

于 2009-08-18T13:20:12.820 に答える
0

余談ですが、MD5 は実際には廃止されており、2010 年以降、保護する価値のあるもの (PHI、PII、または PCI) には使用されません。米国連邦準備制度理事会はこれを実施しており、準拠していないエンティティは多額の $$$ を支払うことになります。

于 2009-08-18T14:21:18.420 に答える