SessionId /身份验证令牌生成的最佳实践

时间:2011-03-09 10:32:20

标签: authentication uuid sessionid

我见过有人使用UUID进行身份验证令牌生成。但是,在RFC 4122中声明

  

不要以为UUID难以猜测;不应该使用它们   作为安全功能(仅仅拥有授权的标识符)   访问),例如。

我想知道,在Java和.NET中使用什么算法用于SessionId / AuthenticationToken生成。在具有超过平均安全需求的应用程序中,UUID确实不适合用于这些目的吗?

2 个答案:

答案 0 :(得分:7)

UUID生成是随机的,但随机的熵不好意味着您最终会轻易猜到UUID。如果使用良好的随机数生成器,则可以生成可用于会话的UUID。然而,问题的关键在于UUID没有内置的重播预防,篡改,固定等等,你必须自己处理(阅读:UUID本身不应该不能被视为有效的会话ID本身)。也就是说,这是一个很好的代码片段,说明如何使用UUID生成安全python

Unique session id in python

答案 1 :(得分:0)

免责声明:我不是密码专家。


  

不要以为UUID很难猜测;例如,它们不应该用作安全功能(仅拥有所有权即可授予访问权限的标识符)。

虽然总体上是正确的,但也应注意,某些系统使用加密强度高的伪随机数生成器(例如Java)来生成UUID:

  

public static UUID randomUUID()

     

静态工厂检索类型4(伪随机生成的)UUID。使用加密强度高的伪随机数生成器生成UUID。

     

返回
     随机生成的UUID


  

我想知道,例如Java和.NET中使用哪种算法来生成SessionId / AuthenticationToken。

Tomcat不使用UUID作为会话令牌,而是使用SHA1PRNG安全随机生成器来生成会话ID:

/**
 * 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中使用随机生成的字符串外,标准实现还向其生成的会话ID中添加jvmRoute

  

此Tomcat实例的路由标识符。它将被添加到会话ID中,以允许负载平衡器进行无状态粘性路由。有关如何将jvmRoute包含在ID中的详细信息取决于实现。有关默认行为,请参见标准实现。

SHA1PRNG的强度已经在here中进行了讨论。

  

在具有比平均安全需求更多的应用程序中,UUID确实不适合这些目的吗?

Java UUID几乎与Tomcat的默认会话ID生成器安全,该生成器生成16字节长的会话ID:

Tomcat

/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;

java.util.UUID in OpenJDK 7

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);
}

但是您可以将Tomcat的会话ID生成器配置为使用16个以上的字节来增强安全性。

进一步阅读: