54

無意味な質問に聞こえるかもしれませんが、聞いてください...

基本的に、GUID が 100% の確率で一意で予測不可能な値を生成することを信頼できるかどうかを知りたいです。

私は基本的に、Web サイトのログイン システムを展開していますが、GUID がセッション Cookie に対して十分に安全であるかどうかを知りたいと考えています。

GUID がどのように生成されるかについての背景は、回答を評価する上で非常に高く評価されます。

重複した質問へのリンクをありがとう、ただし、私の質問は .Net フレームワークに固有のものです。

4

8 に答える 8

30

これはレイモンド・チェンによる優れた内訳です

于 2009-01-21T22:23:43.120 に答える
12

固定長の値が 100% 一意であることを保証することはできません (十分な回数呼び出して、宇宙の終わりを与えるか取るだけです ;-p)。

于 2009-01-21T22:25:06.237 に答える
5

連番の予測可能性について話すことはできませんが、一意になります。ただし、System.Security.Cryptography の乱数​​ジェネレーターを使用する方がよいと思います。単調に増加する値 (時間) で乱数を結び付けて一意のキーを生成すると、一意で予測不可能であることが確認できます。

于 2009-01-21T22:25:08.343 に答える
4

System.Guid.NewGuid() のドキュメントはランダム性を保証していないため、現在の実装は乱数ジェネレーターに基づいています (これはバージョン 4 のアルゴリズムであり、MAC を使用したバージョン 1 からプライバシーに関する懸念が生じた後に考案されました)。アドレス; Apple の OS X のような他のシステムは、まだバージョン 1 のアルゴリズムを使用しています)。

System.Guid.NewGuid() が一意の値を生成する可能性は非常に高いですが、ドキュメントで指定されていないため、その予測可能性について推測することはできません。

于 2009-01-22T00:51:46.800 に答える
3

.NET についてはわかりませんが、UUID アルゴリズムはかなり正確に定義されています。

編集: 適切なビット (ウィキペディアのエントリを参照) を見ると、使用されている UUID のバージョンが説明されているはずです。

編集 2: 「安全な」という言葉の使用に対する危険信号です。これは、明確に定義された暗号化方法を使用する方がよいことを示しています。たとえば、サーバーでセッション ID を生成する場合、次の適切なサブセットの連結に MD5 ハッシュを適用するなどの簡単なことをしてみませんか: {クライアント マシンの IP アドレス、順次インクリメントされるカウンター、任意の固定秘密定数、任意の乱数発生器からの出力など} ?

于 2009-01-21T22:25:14.987 に答える
3

System.Guid.NewGuid が CoCreateGuid を使用すると仮定すると、ランダムではありません。歴史的に、GUID の作成に使用されるアルゴリズムは、時間などの他の要素に加えて、ネットワーク アダプターから MAC アドレスを組み込むことでした。アルゴリズムが変更されたかどうかはわかりません。確かにランダムではありませんが、一意であることが保証されています。

于 2009-01-21T22:26:01.210 に答える
1

GUID は、定義上、すべての点で一意です。昔々、連続した GUID を生成する GUID0 生成ルーチンがいくつかありましたが、それらは... Win98 の問題であり、Microsoft によってホットフィックスされたと思います。

生成された GUID が一意であり、繰り返されたり再生成されたりしないことを信頼できる必要があります。

(編集:そうは言っても、文字列の長さが固定されている場合、英数字の文字列には固定数の順列があることを私たちは皆理解しています。しかし、GUIDの場合、順列の数は経済的です*。)

(*くそー、提案された「天文学的な」数が十分に大きくないXKCDはどこですか?)

于 2009-01-21T22:25:02.413 に答える