我见过有人使用 UUID 来生成身份验证令牌。然而,在RFC 4122中指出
不要假设 UUID 很难猜;例如,它们不应该用作安全功能(仅拥有授予访问权限的标识符)。
我想知道,例如在 Java 和 .NET 中使用哪些算法来生成 SessionId/AuthenticationToken。在具有超过平均安全需求的应用程序中,UUID 是否确实不适合这些目的?
我见过有人使用 UUID 来生成身份验证令牌。然而,在RFC 4122中指出
不要假设 UUID 很难猜;例如,它们不应该用作安全功能(仅拥有授予访问权限的标识符)。
我想知道,例如在 Java 和 .NET 中使用哪些算法来生成 SessionId/AuthenticationToken。在具有超过平均安全需求的应用程序中,UUID 是否确实不适合这些目的?
UUID
生成是随机的,但是熵不好的随机意味着你最终会得到容易猜到UUID
的 s。如果您使用一个好的随机数生成器,您可以生成UUID
可用于会话的 s。然而,问题在于UUID
s 没有内置的重放预防、篡改、固定等功能,您必须自己处理(阅读:UUID 本身不应被视为有效的会话 ID 本身)。也就是说,这是一个很好的片段,用于说明如何UUID
使用以下方法生成安全python
:
免责声明:我不是密码学家。
不要假设 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 中使用随机生成的字符串外,标准实现还会jvmRoute
在它生成的会话 ID 中添加一个:
此 Tomcat 实例的路由标识符。它将被添加到会话 id 以允许负载均衡器进行无状态粘性路由。jvmRoute 如何包含在 id 中的详细信息取决于实现。有关默认行为,请参阅标准实现。
的强度在这里SHA1PRNG
已经讨论过了。
在具有超过平均安全需求的应用程序中,UUID 是否确实不适合这些目的?
Java UUID 几乎与 Tomcat 的默认会话 ID 生成器一样安全,后者生成 16 字节长的会话 ID:
雄猫:
/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;
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 个字节来增加安全性。