首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SessionId/身份验证令牌生成的最佳实践

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

Stack Overflow用户
提问于 2011-03-09 18:32:20
回答 2查看 19.6K关注 0票数 27

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

并不认为UUID很难猜测;例如,它们不应该用作安全功能(仅拥有就可以访问的标识符)。

我想知道,例如,在Java和.NET中用于会话in /身份验证令牌生成的算法是什么。UUID是否真的不适合在安全需求超过平均水平的应用程序中用于这些目的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 02:32:04

UUID的生成是随机的,但随机性和不好的熵意味着你很容易猜出UUIDs。如果你使用一个好的随机数生成器,你可以生成可用于会话的UUIDs。然而,问题是UUID没有内置的重放预防、篡改、固定等功能,你必须自己处理这些问题(请阅读: UUID本身不应被视为有效的会话ID )。也就是说,这里有一个很好的片段,介绍了如何使用python生成安全的UUID

Unique session id in python

票数 14
EN

Stack Overflow用户

发布于 2019-06-21 22:41:07

免责声明:我不是一个密码学家。

并不认为UUID很难猜测;例如,它们不应该用作安全功能(仅拥有就可以访问的标识符)。

虽然通常这是真的,但是还应该注意到,一些系统使用密码强伪随机数生成器(例如Java )来产生UUID

public static UUID randomUUID()

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

返回

随机生成的UUID

我想知道,在

和.NET中使用了什么算法来生成会话in /身份验证令牌。

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

代码语言:javascript
复制
/**
 * 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中的细节取决于实现。有关默认行为,请参阅标准实现。

here已经讨论过SHA1PRNG的优势。

在一个安全需求超过平均水平的应用程序中,

UUID是否真的不适合用于这些目的?

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

代码语言:javascript
复制
/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;

代码语言:javascript
复制
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个字节来增加安全性。

进一步阅读:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5244455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档