免責事項:私は暗号学者ではありません。
UUIDを推測するのが難しいと思い込まないでください。たとえば、セキュリティ機能(単なる所有物がアクセスを許可する識別子)として使用しないでください。
一般的にはそうですが、一部のシステムでは、暗号的に強力な疑似乱数ジェネレーター(Javaなど)を使用してUUIDを生成することにも注意してください。
public static UUID randomUUID()
タイプ4(疑似ランダム生成)UUIDを取得するための静的ファクトリ。UUIDは、暗号的に強力な疑似乱数ジェネレーターを使用して生成されます。
戻り値:
ランダムに生成されたUUID
たとえば、SessionId/AuthenticationTokenの生成にJavaや.NETでどのアルゴリズムが使用されているのか疑問に思いました。
TomcatはセッショントークンとしてUUIDを使用しませんが、セッションIDを生成するためにSHA1PRNGセキュアランダムジェネレーターを使用します。
/**
* The name of the algorithm to use to create instances of
* {@link SecureRandom} which are used to generate session IDs. If no
* algorithm is specified, SHA1PRNG is used. To use the platform default
* (which may be SHA1PRNG), specify the empty string. If an invalid
* algorithm and/or provider is specified the {@link SecureRandom} instances
* will be created using the defaults. If that fails, the {@link
* SecureRandom} instances will be created using platform defaults.
*/
private String secureRandomAlgorithm = "SHA1PRNG";
org.apache.catalina.SessionIdGenerator
これは単なるデフォルトであり、インターフェースを実装することでカスタムセッションIDジェネレーターを提供できます。
セッションIDでランダムに生成された文字列を使用する以外に、標準の実装では、jvmRoute
生成するセッションIDにを追加します。
このTomcatインスタンスのルーティング識別子。ロードバランサーによるステートレススティッキネスルーティングを可能にするために、セッションIDに追加されます。jvmRouteがIDに含まれる方法の詳細は、実装によって異なります。デフォルトの動作については、標準の実装を参照してください。
の強さSHA1PRNG
はすでにここで議論されています。
UUIDは、平均以上のセキュリティニーズを持つアプリケーションでこれらの目的に実際に不適切ですか?
Java UUIDは、16バイト長のセッションIDを生成するTomcatのデフォルトのセッションIDジェネレーターとほぼ同じくらい安全です。
Tomcat:
/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;
OpenJDK 7のjava.util.UUID:
public static UUID randomUUID() {
SecureRandom ng = numberGenerator;
if (ng == null) {
numberGenerator = ng = new SecureRandom();
}
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUID(randomBytes);
}
ただし、セキュリティを強化するために16バイト以上を使用するようにTomcatのセッションIDジェネレーターを構成できます。
参考文献: