27

認証トークンの生成にUUIDを使用している人を見たことがあります。ただし、RFC 4122には、次のように記載されています。

UUIDを推測するのが難しいと思い込まないでください。たとえば、セキュリティ機能(単なる所有物がアクセスを許可する識別子)として使用しないでください。

たとえば、SessionId/AuthenticationTokenの生成にJavaや.NETでどのアルゴリズムが使用されているのか疑問に思いました。UUIDは、平均以上のセキュリティニーズを持つアプリケーションでこれらの目的に実際に不適切ですか?

4

2 に答える 2

14

UUID生成はランダムですが、エントロピーが悪いランダムは、UUIDsを推測しやすいことを意味します。優れた乱数ジェネレーターを使用するとUUID、セッションに使用できるを生成できます。ただし、これUUIDの落とし穴は、リプレイ防止、改ざん、固定などが組み込まれていないことです。これは自分で処理する必要があります(UUID自体は有効なセッションID自体)。UUIDそうは言っても、以下を使用して安全なものを生成する方法の良いスニペットを次に示しますpython

Pythonの一意のセッションID

于 2011-09-27T18:32:04.210 に答える
5

免責事項:私は暗号学者ではありません。


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ジェネレーターを構成できます。

参考文献:

于 2019-06-21T14:41:07.183 に答える