概要
Flash および/または JavaScript クライアントでのグローバルに一意な ID。現在のブラウザー/フラッシュで利用可能な RNG でこれを行うことはできますか?それとも、サーバー側のランダム性を備えた複合 ID を作成する必要がありますか?
詳細
オブジェクトのグローバルに一意の識別子を生成する必要があります。IDを交換できる必要があるJavaで書かれたサーバー側の「システム」が複数あります。これらの各システムには、新しいオブジェクトの ID を実際に生成する flex/javascript クライアントのセットもあります。無関係なシステムのセット全体でグローバルな一意性を保証する必要があります。たとえば、2 つの独立したシステムのデータベースをマージ/同期できる必要があります。これらの ID が競合しないこと、および一度作成されたオブジェクトの ID を変更する必要がないことを保証する必要があります。すべての ID についてサーバーに接続せずに、フラッシュおよび JavaScript クライアントで ID を生成できるようにする必要があります。サーバーが提供するシードまたはシステム ID に依存するソリューションは、サーバーが頻繁に接続されない限り問題ありません。完全に切断された状態で機能するソリューションが望ましいです。同様に、システムの事前登録を必要としないソリューションは、中央機関 (MAC アドレスの OUI など) に依存するソリューションよりも適しています。
明らかな解決策は、フラッシュの UIDUtil などの「UUID ジェネレーターを使用する」ことです。この関数は、特にグローバルな一意性を否認します。一般に、グローバルな一意性を保証するために PRNG に依存することには懸念があります。
提案されたソリューション
クライアントの安全な乱数ジェネレーターに完全に依存します。
Flash 11 以降にはflash.crypto.generateRandomBytesがあります。Javascript には window.crypto がありますが、これはかなり新しく、IE ではサポートされていません。マウスを使用してエントロピーを追加するsjclのようなソリューションがあります。
完全な RNG が与えられた場合、2 122のランダムな UID の衝突の可能性は隕石のように小さいことは理解していますが、JavaScript またはフラッシュ クライアントで実際にこの程度のランダム性が得られないのではないかと心配しています。さらに、暗号化 RNG の典型的な使用例が私のものとは異なることを懸念しています。セッション キーなどについては、攻撃者が予測できない限り、衝突は許容されます。私の場合、衝突はまったく受け入れられません。 一意の ID を確保するために、安全な RNG の未加工の出力に本当に依存する必要がありますか?
システム ID、セッション ID、およびオブジェクト ID を含む複合ID を生成します。
明らかな実装は、サーバーのインストール時にシステム UUID を作成し、クライアントごとのログイン セッション ID を (データベースなどに) 保持し、システム ID とセッション ID をクライアントに送信して、セッションごとのカウンターを保持することです。 . uid は、システム ID、セッション ID、クライアント カウンターの 3 つです。
これらを直接連結するか、暗号化ハッシュでハッシュすることを想像できます。特にハッシュへの入力が出力とほぼ同じサイズである場合、ハッシュ自体が潜在的に衝突を引き起こす可能性があることを懸念しています。しかし、ハッシュによってシステム ID とカウンターがわかりにくくなり、情報が漏洩する可能性があります。
インストール時にシステム ID を生成する代わりに、別の解決策として、DOI のように一意のシステム ID を配布する中央レジストリを用意することもできます。ただし、これにはさらに調整が必要ですが、グローバルな一意性を本当に保証する唯一の方法だと思います。
主な質問
- ランダムまたは複合ベース?
- システム ID を含めますか?
- システム ID の場合: ランダムなシステム ID を生成するか、中央レジストリを使用しますか?
- タイムスタンプまたはその他のノンスを含めますか?
- ハッシュするかしないか?