Python:16字节令牌生成用于认证

1 投票
1 回答
783 浏览
提问于 2025-04-18 17:40

在Python中,我需要生成16个字节的令牌(这是因为机器的限制),用于身份验证。有什么好的方法可以做到这一点呢:

  • os.urandom:这个方法需要传入一个字节数作为参数,然后返回相同数量的随机字节。如果同一台机器同时生成很多这样的随机数,这个方法会好吗?
  • uuid.uuid4:生成的字符串str(uuid.uuid4())是16个字节吗?如果不是,我们可以用uuid来生成16个字节吗?

1 个回答

1

uuid.uuid4() 这个函数会生成16个随机字节(如果系统支持的话,会使用系统的urandom),但是当这些字节转换成可以打印的ASCII字符后,输出的长度会超过16个字节。你需要的是16个字节的随机数据,还是16个可打印的字节呢?如果是用来做令牌的话,说明你需要的是后者。在这种情况下,你需要截断它(从末尾截断,而不是从开头,因为开头有一些非随机的版本信息字节,而且去掉连字符也没什么用),要明白这样你得到的随机性其实少于16个字节。

或者,你可以自己对随机数据进行base64编码。用b64编码可以在16个字节里放更多的数据,相比之下uuid使用的b16(十六进制)编码只能放8个字节。

urandom的实现是跟操作系统有关的。一般来说,urandom是非阻塞的,并且使用的是一种伪随机数生成器(PRNG),这个生成器是用可用的熵(随机性)来初始化的。

撰写回答