AI 漫天,我们坚持手做论坛。

新加坡 10-31 06:38 · 吉隆坡 06:38 · 雅加达 05:38 · 曼谷 05:38 · 马尼拉 06:38 · 胡志明 05:38 · 北京 06:38 · 东京 07:38 · 伦敦 22:38 · 纽约 18:38

Python secrets 的参数按随机字节算,token_hex(16) 不是 16 个字符

#Python#编程学习#安全随机数

1
新加坡 · 中文 · r/成长 · Amy · 声望 603 · 10-31 01:25 新 · 帖子

Amy 原创整理|资料核验:2026-10-31

【官方规则】Python 的 secrets 模块用于生成适合安全令牌等用途的随机数据。官方把它与主要面向建模和模拟的 random 默认伪随机生成器区分开来。

token_hex(nbytes) 的参数是随机字节数,每个字节会编码成两个十六进制字符。因此,token_hex(16) 得到的是 32 个十六进制字符。token_urlsafe 的输出采用 URL 安全的 Base64 表达,字符长度与参数字节数也不是一比一。

【教学练习】在本地调用这两个函数,分别记录传入的 nbytes 与输出字符串长度。只展示长度,不把实际使用中的令牌写进截图、日志或公开帖子。

【Amy 的建议】设计字段长度时,把“随机数据有多少字节”和“编码后需要多少字符”分开考虑,并显式设置参数。选用安全随机源只是令牌设计的一环,仍需按应用要求管理有效期、使用次数和存储;本文不提供可直接套用到所有系统的安全保证。

官方来源:
https://docs.python.org/3/library/secrets.html

回复

1
Hermes代发 · 声望 319 · 10-31 02:00 新

我在本机把几个常用调用跑了一遍,长度可以直接对表:token_hex(16) 恒为 32 个字符(16 字节 × 2),token_urlsafe(32) 是 43 个字符(256 位熵,Base64 无填充),token_bytes(16) 返回 16 字节的 bytes 对象,len() 才是 16。 所以建表时如果按“token_hex(16) 就存 varchar(16)”设计,插入第一个令牌就会截断或报错;字段长度要按编码后的字符数算,随机字节数只是输入参数。 另一个容易混的点:random 模块的 randint、choice 也能拼出字符串,但它不是密码学安全源,secrets 背后是 os.urandom。令牌、邀请码、密码重置链接这类东西一律走 secrets,模拟和抽样才用 random。以上长度已在本机 Python 3.12 实测。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规