UUID を使用して何かを一意に識別するのは安全ですか (サーバーにアップロードされたファイルに使用しています)。私が理解しているように、それは乱数に基づいています。しかし、十分な時間が与えられれば、純粋な偶然によって、最終的にはそれを繰り返すように思えます. この問題を軽減するためのより良いシステムまたは何らかのタイプのパターンはありますか?
12 に答える
とても安全:
特定の人が隕石に当たる年間リスクは 170 億分の 1 の確率であると推定されます。これは、確率が約 0.00000000006 (6 × 10 −11 ) であることを意味し、数十兆の UUID を作成する確率に相当します。 1年で、1つの重複があります。言い換えれば、次の 100 年間、毎秒 10 億の UUID を生成した後で初めて、複製が 1 つだけ作成される確率は約 50% になります。
警告:
ただし、これらの確率は、UUID が十分なエントロピーを使用して生成された場合にのみ保持されます。そうしないと、統計的分散が低くなる可能性があるため、重複の可能性が大幅に高くなる可能性があります。多くのデバイスからのデータがマージされた場合でも UUID が衝突しないように、分散アプリケーションに一意の識別子が必要な場合、すべてのデバイスで使用されるシードとジェネレーターのランダム性は、アプリケーションの存続期間中信頼できるものでなければなりません。これが実現できない場合、RFC4122 は代わりに名前空間バリアントを使用することを推奨しています。
出典:普遍的に一意の識別子に関するウィキペディアの記事の重複のランダム UUID 確率セクション(リンクは、セクションを編集する前の 2016 年 12 月からの改訂につながります)。
また、同じ Universally Unique Identifier の記事であるCollisionsの同じ主題に関する現在のセクションも参照してください。
「十分な時間が与えられた」とは 100 年を意味し、1 秒間に 10 億の速度でそれらを作成している場合、100 年後に衝突する可能性は 50% です。
UUID には複数のタイプがあるため、「どの程度安全か」は、使用しているタイプ (UUID 仕様では「バージョン」と呼ばれます) によって異なります。
バージョン 1 は、時間ベースと MAC アドレスの UUID です。128 ビットには、ネットワーク カードの MAC アドレス (製造元によって一意に割り当てられる) 用の 48 ビットと、分解能が 100 ナノ秒の 60 ビット クロックが含まれます。そのクロックは西暦 3603 年にラップするため、少なくともそれまではこれらの UUID は安全です (1 秒あたり 1000 万を超える新しい UUID が必要になるか、誰かがネットワーク カードを複製しない限り)。私が「少なくとも」と言ったのは、時計が 1582 年 10 月 15 日に開始するためです。つまり、時計が一周してから約 400 年後には、わずかな重複の可能性さえあります。
バージョン 4 は乱数 UUID です。6 つの固定ビットがあり、残りの UUID は 122 ビットのランダム性です。ウィキペディアまたは重複の可能性が非常に低いことを説明するその他の分析を参照してください。
バージョン 3 は MD5 を使用し、バージョン 5 は SHA-1 を使用してこれらの 122 ビットを作成します。ランダムまたは疑似乱数ジェネレーターの代わりです。したがって、安全性の観点からは、バージョン 4 が統計上の問題であるようなものです (ダイジェスト アルゴリズムが処理しているものが常に一意であることを確認する限り)。
バージョン 2 はバージョン 1 に似ていますが、クロックが小さいため、はるかに早くラップアラウンドします。ただし、バージョン 2 の UUID は DCE 用であるため、これらを使用しないでください。
したがって、すべての実際的な問題に対して、それらは安全です。可能性に任せるのが苦手な場合 (たとえば、あなたが生きているうちに大きな小惑星によって地球が破壊されることを心配しているタイプの人など) は、必ずバージョン 1 UUID を使用し、それが一意であることが保証されていることを確認してください (ただし、西暦 3603 年を超えて生きる予定がない限り)。
では、誰もが単純にバージョン 1 UUID を使用しないのはなぜでしょうか? これは、バージョン 1 UUID が生成されたマシンの MAC アドレスを明らかにし、それらが予測可能であるためです。これらの UUID を使用するアプリケーションのセキュリティに影響を与える可能性のある 2 つのことです。
これに対する答えは、UUIDのバージョンに大きく依存する可能性があります。
多くのUUIDジェネレーターは、バージョン4の乱数を使用します。ただし、これらの多くは、Pseudo a RandomNumberGeneratorを使用して生成します。
シードが不十分で期間が短いPRNGを使用してUUIDを生成する場合、それはまったく安全ではないと思います。一部の乱数ジェネレーターも分散が不十分です。つまり、特定の数を他の数よりも頻繁に優先します。これはうまくいきません。
したがって、それを生成するために使用されるアルゴリズムと同じくらい安全です。
反対に、これらの質問に対する答えを知っている場合は、バージョン4のuuidを非常に安全に使用できるはずです。実際、私はこれを使用してネットワークブロックファイルシステム上のブロックを識別していますが、これまでのところ衝突はありません。
私の場合、使用しているPRNGはメルセンヌツイスターであり、/ dev/urandomを含む複数のソースからのシード方法に注意しています。メルセンヌツイスターの周期は2^19937 − 1です。繰り返しuuidが表示されるまでには、非常に長い時間がかかります。
したがって、適切なライブラリを選択するか、自分で生成して、適切なPRNGアルゴリズムを使用していることを確認してください。
ウィキペディアからの引用:
したがって、誰でも UUID を作成し、それを使用して何かを識別することができ、その識別子が意図せず他の目的で使用されることは決してないという合理的な確信を持って何かを識別することができます。
それが実際にどれだけ安全であるかについて、かなり詳細に説明し続けています. あなたの質問に答えるには: はい、十分に安全です。
UUID4 の場合、一辺が 360,000km の立方体の箱の砂粒とほぼ同じ数の ID があるようにします。これは、木星の直径の 2 1/2 倍の長さの側面を持つ箱です。
ユニットを台無しにした場合に誰かが教えてくれるように作業しています。
UUID スキームは通常、疑似乱数要素だけでなく、現在のシステム時間、およびネットワーク MAC アドレスなど、利用可能な場合はある種のしばしば一意のハードウェア ID も使用します。
UUID を使用することの要点は、UUID が独自の ID を提供するよりも優れた仕事をすることを信頼することです。これは、独自の暗号化ライブラリを作成するのではなく、サード パーティの暗号化ライブラリを使用する理由と同じです。自分でやった方が楽しいかもしれませんが、通常は責任が少なくなります。
何年もやっています。問題が発生することはありません。
私は通常、すべてのキーと変更された日付などを含む 1 つのテーブルを持つように DB をセットアップします。重複キーの問題に遭遇したことはありません。
唯一の欠点は、いくつかのクエリを作成して情報をすばやく検索するときに、キーのコピーと貼り付けを何度も行うことです。覚えやすい短い ID はもうありません。
これがあなたにとって重要かどうかはわかりませんが、GUID はグローバルに一意ですが、GUID の部分文字列は一意ではないことに注意してください。