资讯动态

为什么不能自己写随机数:从伪随机到密码学随机

发布时间:2026/10/15 21:16:02 来源:尧图企业网站定制
授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、同一句取个随机数其实是两种要求1.1 两种脚本那句代码长得一模一样写脚本的人几乎都会说出同一句话这里取个随机数。可是这句话落到两种场合指向的是两件并不相同的事。做模拟、抽样、随机取值、洗牌、给测试造一批样例数据——这些场合要的是结果分布均匀、看起来乱、没有肉眼能看出的规律。生成token、密钥、会话标识、重置链接里那一串字符——这些场合要的不是看起来乱而是别人猜不到。前者要面对的是看数据的人后者要面对的是想把那串东西猜出来的人。观众不同尺子也不同。1.2 两把尺子不要混用两种场合并排放在一张表里同一个词、两个标准立刻显形。场合真正的要求谁在盯着它模拟、抽样、测试样例、洗牌分布均匀、看起来乱你自己的分析过程token、密钥、会话标识、重置链接猜不到任何想知道它的人看第二行最后那一格对手不是看数据的人而是想把整串东西搜出来的人。要求于是从看起来乱升级成猜不到——两者并不等价这就是本文要讲的全部。1.3 本文只做一件事本文只回答一个问题当你在脚本里写下取个随机数时怎么判断这里要的是哪一种以及该用什么去取。三件事先说清楚本文不写任何怎么去猜、怎么去试出某个随机数或那串标识的思路或步骤。本文谈的是随机性本身哈希用于完整性、内容寻址的题目属于另一条轴本文不复述它的定义第二章会用一句话把这条界划出来。本文不涉及编码也就是字符与字节之间怎么互相转换那一类问题。本章可以带走的一句脚本里那句取个随机数其实有两种要求一种是看起来乱一种是猜不到判断自己落在哪一边是所有选择的起点。二、“看起来乱不等于猜不到”2.1 标准原文里那句最直接的判断随机性这件事国际上有一份权威文本可直接拿来当尺子——RFC 4086《Randomness Requirements for Security》它同时是 BCP 106。它第一节里有一句判断几乎就是照着看起来乱就够了说的This can easily fail if pseudo-random data is used that meets only traditional statistical tests for randomness, or that is based on limited-range sources such as clocks. Sometimes such pseudo-random quantities can be guessed by an adversary searching through an embarrassingly small space of possibilities.——如果用的是只通过了传统统计检验的伪随机数据或者来自像时钟这样范围有限的源这件事很容易失败这类伪随机量有时会被对手在一个小得令人尴尬的可能性空间里搜出来。要害有二。第一能通过统计检验和猜不到是两回事统计检验只问分布像不像随机管不了来源是否容易被复制。第二范围有限的源是硬伤时钟能取的值就那么些拿它当源头产出就天生带着这个上限。2.2 官方给这件事起了个名字“伪安全”紧接着还有一句更狠的判断出自同一份文本的摘要The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.——用伪随机过程去生成用于保密的量得到的结果可能是**“伪安全”。一个老练的对手把产生这些量时的环境复现出来、再在由此得到的小集合里搜可能比在完整的可能性空间里去找还要容易**。这句里藏着一个反直觉的点对手不一定要更聪明他只要能把环境摆回原样。一旦做到你要防的完整空间就塌缩成了一个小集合。这就是伪随机与密码学随机分家之处。2.3 为什么标准把它抬到核心的高度RFC 4086 在第一节里还写了两句把这件事的位置摆得很高At the heart of all cryptographic systems is the generation of secret, unguessable (i.e., random) numbers.The lack of generally available facilities for generating such random numbers (that is, the lack of general availability of truly unpredictable sources) forms an open wound in the design of cryptographic software.第一句说一切密码系统的核心是生成保密的、猜不到的数字。第二句说缺少能普遍用上的、真正不可预测的源是密码学软件设计里的一处开放伤口。注意真正不可预测——它和统计上像随机不是一个要求。第一句那个括号也值得多看官方把猜不到的直接注成了random在要求猜不到的语境里这个词的分量比日常用法重得多。2.4 一条必须划清的界这里要划一条界本文谈的是随机性够不够猜不到而校验和与签名“镜像标签与摘要那两篇谈的是哈希用于完整性校验与内容寻址”是另一条轴上的事本文不复述哈希的定义也不谈碰撞与签名。本章可以带走的一句判断一个随机源合不合格看的不是它像不像随机而是产生它的那套环境和范围别人能不能复现。三、种子伪随机的命门3.1 官方那个8 位种子配 128 位密钥的例子伪随机生成器的输出完全由一个初始值决定这个初始值叫种子。种子有多薄产出就有多薄。RFC 4086 第三节举了一个例子把这件事说得非常直白consider a cryptographic system that uses 128-bit keys. If these keys are derived using a fixed pseudo-random number generator that is seeded with an 8-bit seed, then an adversary needs to search through only 256 keys (by running the pseudo-random number generator with every possible seed), not 2^128 keys as may at first appear to be the case. Only 8 bits of “information” are in these 128-bit keys.——设想一个用128 位密钥的密码系统。如果这些密钥是用一个固定的伪随机生成器、以 8 位种子导出来的那么对手只需要搜 256 把密钥把伪随机生成器按每一种可能的种子跑一遍而不是它乍看之下的 2^128 把。这 128 位密钥里只有 8 位信息。这个例子值得逐字读它把一句容易被忽略的话摆上台面——密钥的长度不等于密钥里信息的量。128 位是格子有多少8 位是真正填进去的不确定性有多少后者才决定这道题难不难。说明这里的256与2^128是官方原文给出的对照。本文只引用这一处不另外做任何数值推算。3.2 本机实测同一种子两次输出逐位一致理论讲完回到自己机器上跑一遍会更直观。下面这段脚本在本机跑过输出是什么样原样放在代码块后面。2026-10-14 本机实测importrandom,secretsdefthree_floats():random.seed(2026)# 同一个种子return[round(random.random(),6)for_inrange(3)]print(第一次:,three_floats())print(第二次:,three_floats())print(token 第一次:,secrets.token_hex(8))print(token 第二次:,secrets.token_hex(8))本机Python 3.13.12输出两次的random.random()序列完全相同0.11912 / 0.502516 / 0.511823而secrets.token_hex(8)两次结果不同。同一台机器、同一份脚本只因种子被固定成 2026那串看起来乱的小数就每次都一模一样。伪随机的输出不是凭空乱它是从一个确定起点按确定规则长出来的起点不变长出来的就不变。3.3 可复现是特性也是命门必须说清可复现本身不是缺陷它是伪随机生成器的设计目标。做模拟、跑实验、给别人复现结果都需要同种子出同一串数。问题出在用错场合。一旦把这套可复现的东西用在要求猜不到的地方优点立刻翻面成命门只要种子被别人拿到或猜到整串结果就能被完整重放。于是全部安全强度就退回到种子有多难猜这一件事上——而种子从哪来正是下一章的内容。本章可以带走的一句伪随机的输出完全由种子决定可复现在模拟里是优点、在要求猜不到的场合是命门所以真正要盯住的是种子的来源。四、系统的熵源在哪里既然种子决定一切那么种子该从哪来就成了整件事的枢纽。答案是从操作系统提供的熵源来。这套东西是分层的从内核一直到你手里那个函数一共有几站。4.1 内核那一侧一个随机设备在本机macOS的man 4 random里对随机设备的定性是这么写的Therandomdevice produces uniformly distributed random byte values of potentially high quality.——random设备产出均匀分布、质量可能很高的随机字节。这是整条链子的最底端也是真正的不可预测通常落脚的地方。4.2 系统调用那一侧getentropy(2)同一份手册接着指出同样的随机数据还有另一个入口——系统调用The same random data is also available fromgetentropy(2). Using thegetentropy(2)system call interface will provide resiliency to file descriptor exhaustion, chroot, or sandboxing which can make/dev/randomunavailable.——同样的随机数据也能通过getentropy(2)拿到。官方给的理由是走系统调用这条接口对文件描述符耗尽、chroot、沙箱这几类会让/dev/random变得不可用的情况更有韧性。这句话点出一个易被忽略的现实“设备文件存在和我的程序总能打开它”是两件事。受限环境里直接读设备文件可能走不通而系统调用接口绕开了这个依赖。4.3 用户态那一侧arc4random(3)再往上一层手册给了第三个名字thearc4random(3)API provides a fast userspace random number generator built on therandomdata source and is preferred over directly accessing the system’s random device.——arc4random(3)提供了一个建立在random数据源之上的、快速用户态随机数生成器并且比起直接去访问系统的随机设备官方更推荐用它。三层结构到这里就清楚了内核随机设备是源系统调用是一层稳定入口用户态 API 又是一层更省心的封装。越往上越不用操心设备能不能打开、读到的够不够。4.4 两个设备名与 Fortuna在 macOS 上/dev/random与/dev/urandom这两个名字都是存在的。手册对它们的关系有一段话但它同时牵出一个必须小心的地方/dev/urandomis a compatibility nod to Linux. On Linux,/dev/urandomwill produce lower quality output if the entropy pool drains, while/dev/randomwill prefer to block and wait for additional entropy to be collected. With Fortuna, this choice and distinction is not necessary, and the two devices behave identically. You may use either.这段话有前半句和后半句。后半句讲的是这份手册描述的系统本身它用 Fortuna 算法所以那种选择与区分没有必要两个设备行为一致用哪个都行。前半句On Linux, …那一段是这份 Darwin 手册里描述 Linux的段落。这里必须把边界写清楚截至 2026-10-14本文不据此为 Linux 侧/dev/random与/dev/urandom的当前实现下任何结论。一份手册顺带描述另一个系统的段落不能当作那个系统现状的依据。本机的事实可以照实看一眼2026-10-14 本机实测ls-l/dev/random /dev/urandom本机输出显示两个名字都指向字符设备属性以c开头属主为root wheel。再看它们背后的算法Therandomdevice implements theFortunapseudo random number generator algorithm and maintains its entropy pool.——随机设备实现了Fortuna 伪随机数生成算法并维护着自己的熵池。所以这里说的设备本质上是一个持续吸收熵、再按算法吐出字节的生成器而不是一台能测出真正的物理随机的仪器。至于直接调getentropy(2)长什么样下面只给一个形状本机没有编译运行过其中任何一行⚠️代码待验证/* 形状示意不对应任何真实程序 */#includeunistd.hunsignedcharbuf[32];getentropy(buf,sizeof(buf));/* 从系统熵源取随机字节 */4.5 一条从源到你手里的链子把这一章串起来是一条清晰的链子内核熵源随机设备 / Fortuna→ 系统调用接口getentropy(2)→ 用户态 APIarc4random(3)→ 你调用的那个库函数。你在脚本里写下的那一行站在链子最右端。要判断它靠不靠得住就往左看它接到的是系统的熵源还是一个自己造的、种子薄薄的伪随机生成器。这正是下一章要讲的。本章可以带走的一句要求猜不到的随机最终必须落到操作系统提供的熵源上内核设备、系统调用、用户态 API 是同一件事的三层入口越往上越省心。五、库函数怎么选链子的最右端就是平时随手调用的那些库函数。以 Python 为例官方文档对两个模块各自说了什么几乎不用翻译就能看懂。5.1secrets的定位为保密而生Python 官方secrets文档的开头是这么写的Thesecretsmodule is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.——secrets模块用来生成密码学强度的随机数适合处理口令、账号认证、安全 token 以及相关的密钥类数据。紧接着那句才是这份文档里最该被记住的In particular,secretsshould be used in preference to the default pseudo-random number generator in therandommodule, which is designed for modelling and simulation, not security or cryptography.——secrets应当优先于random模块里的那个默认伪随机生成器被使用因为后者是为建模与仿真设计的不是为安全或密码学设计的。文档还补了一句它的底气从哪来Thesecretsmodule provides access to the most secure source of randomness that your operating system provides.——secrets提供的是你的操作系统所能提供的最安全的随机源。它接到链子的哪里就很清楚了直接踩在操作系统的熵源上。5.2random的官方警告它自己承认不适合random模块自己怎么说它的文档里警告写得很直接The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see thesecretsmodule.——这个模块里的伪随机生成器不应当被用于安全目的用于安全或密码学时请见secrets模块。模块概述里还有一句更彻底However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.——它是完全确定性的因此并非对所有用途都合适并且完全不适合密码学用途。同一个模块里的randbytes条目下也留了一句This method should not be used for generating security tokens. Usesecrets.token_bytes()instead.——不应当用这个方法去生成安全 token应当改用secrets.token_bytes()。把这几句放在一起结论不用自己下做模拟的那个模块自己就写了不接要求猜不到的活。5.3 该取多长官方给的口径选对模块接着是取多少。secrets文档给了一段关于篇幅的建议里面既有结论也有这个结论的时间点To be secure against brute-force attacks, tokens need to have sufficient randomness. Unfortunately, what is considered sufficient will necessarily increase as computers get more powerful and able to make more guesses in a shorter period. As of 2015, it is believed that 32 bytes (256 bits) of randomness is sufficient for the typical use-case expected for thesecretsmodule.——token 要有足够的随机性而够的标准必然会随着算力增长而水涨船高。文档给的时间锚点是As of 2015截至 2015 年**32 字节256 位**的随机性足以覆盖secrets模块的典型用例。最该记的不是32 字节而是前面那句标准会随着算力增长而提高——所以文档标了时间点而不是当成永久常数。本机实测也显示secrets.DEFAULT_ENTROPY的值是32字节正是token_*系列不指定长度时的默认用量。5.4 一句话的选择原则把这一章收成一张对照表你要做的事该用哪一类判断依据官方口径模拟、抽样、造样例、洗牌伪随机生成器如random的默认生成器可复现、快、为建模与仿真设计token、密钥、会话标识、重置链接密码学随机源如secrets文档明写应当优先、“最安全的随机源”原则就一句先问这个值要不要猜不到要就走密码学随机源那一列不要才轮到伪随机生成器。配套资料把两种尺子怎么分“种子为什么是命门”“系统的熵源三层入口”库函数怎么选压成一页对照卡放在资料包里扫码即可获取本章可以带走的一句选库函数之前先问要不要猜不到——要就用密码学随机源secrets一类random的官方文档自己写了它只做建模与仿真。六、落到 UUID为什么 v4 要强调 CSPRNG6.1 UUIDv4 的本意就是随机前面几章的道理落到天天见的 UUID 上会很具体。RFC 9562 的 5.4 节一开头就写明UUIDv4 is meant for generating UUIDs from truly random or pseudorandom numbers.——UUIDv4 本来就是为了用真随机或伪随机的数来生成 UUID。同一节点出另一种做法先取定量的随机位再按规范填入版本位与变体位其中randomly generate the exact required number of bits for random_a, random_b, and random_c (122 bits total)——随机生成random_a、random_b、random_c所需的精确位数合计 122 位然后把版本与变体拼到规范规定的位置上。这里出现的是规范原文给出的 122 位这个数不是本文推算出来的。6.2 5.4 节把问题交给了 6.9 节5.4 节最后一句是关于随机数据生成的指导见 6.9 节。6.9 节的名字叫Unguessability不可猜性全节就几行Implementations SHOULD utilize a cryptographically secure pseudorandom number generator (CSPRNG) to provide values that are both difficult to predict (“unguessable”) and have a low likelihood of collision (“unique”).——实现应当SHOULD使用密码学安全的伪随机数生成器CSPRNG来提供**既难以预测unguessable又不太可能重复unique**的值。这一句把本文前面所有的东西收进了一个术语CSPRNG。“难预测对应本文第二章讲的猜不到”低重复可能对应 UUID 这个场景本身对唯一性的要求。“伪随机”pseudorandom也在这里出现——关键在于它前面那两个字“密码学安全”。同样是伪随机加不加这个限定就是本文第三章那扇命门的分水岭。6.3 为什么规范盯住重新播种紧接着还有一句容易被当成附带说明其实很实在Take care to ensure the CSPRNG state is properly reseeded upon state changes, such as process forks, to ensure proper CSPRNG operation.——要注意确保 CSPRNG 的状态在发生状态变化例如进程 fork时被正确地重新播种以保证 CSPRNG 正常工作。这句说明 CSPRNG 也不是一个函数调完就万事大吉。它维护着内部状态而这个状态在进程被复制fork之后需要被重新播种才不会让两个本应独立的副本行动一致。这正是规范用应当SHOULD并专门提一句注意的原因。6.4 把三层串到 UUID 上回头看前面三章分别回答了三个问题在这里正好各归其位第二章回答的是难在哪——“看起来乱不等于猜不到”所以要的是 CSPRNG 而不是普通伪随机。第三章回答的是命门在哪——种子和状态决定输出所以 6.9 节才盯着重新播种。第四章回答的是从哪来——不可预测的源在操作系统那一层所以 6.9 节点名要的是系统能提供的最安全随机源那一路。本章可以带走的一句UUIDv4 要的从来不只是随机规范用的是应当使用 CSPRNG——它要的是难预测 低重复而这个区别就是伪随机前面那两个字的分量。七、总结与自查7.1 一条可以带走的判断链先问这个值要不要猜不到。要进第 2 步不要模拟、抽样、造样例伪随机生成器就够。要猜不到就别停在看起来乱上。能过统计检验、或源头范围有限比如时钟都可能栽RN03。检查种子和状态是接在操作系统熵源上还是自己造了个种子薄薄的生成器RN04 的例子 本机实测。顺着链子往左看内核熵源 → 系统调用 → 用户态 API看自己那一行最终接到哪一站/dev/random/getentropy(2)/arc4random(3)。选库函数时认准官方口径要猜不到用secrets一类random的文档自己说了它不适合RN08 / RN10。涉及 UUID 这类带规范的东西看规范怎么要求——UUIDv4 那句是应当使用 CSPRNG还附带进程 fork 后要正确重新播种RN11 / RN12。这条链子里最值钱的是第 1 步大多数用错随机数的事故不是选错了算法而是压根没问过这个值要不要猜不到。7.2 一份自查清单自查项为什么问这一条这个值是给人看的样例还是要防人猜的凭据两种要求不同这是所有选择的分岔口我是不是把能过统计检验当成了猜不到RFC 4086 §1 明说这两件事不等价我的随机数种子是从操作系统熵源来的吗种子决定输出种子薄则全线薄RN04我写的那行代码最终接到的是熵源还是自造生成器顺着内核 → 系统调用 → 用户态 API往左核我有没有先看官方文档对这两个模块的定性secrets与random的适用面文档写得清清楚楚涉及 UUID 这类规范时我看的是规范原文还是想当然规范用的是应当使用 CSPRNG还带重新播种的要求7.3 本文的使用限制不写怎么猜、怎么试出某个随机数或那串标识的任何思路或步骤这类内容不在本文范围内。只引用官方原文给出的数字如 RN04 的 256 与 2^128、secrets文档的 32 字节、RFC 9562 的 122 位不另外做数值推算。不对 Linux 侧/dev/random与/dev/urandom的实现下任何结论本文引用的那段 Linux 描述出处是 Darwin 手册中顺带描述 Linux 的段落。不涉及编码也不引任何报错文本不涉及口令破解内容与具体产品、库的漏洞。凡涉及目前 / 最新 / 已这类状态的判断一律以截至 2026-10-14为界。7.4 总结回到开头那句话“这里取个随机数。”这句代码在两种场合长得一模一样要求却完全不同做模拟要的是看起来乱生成 token / 密钥 / 会话标识要的是猜不到。标准原文把区别讲得很直接——只过传统统计检验的伪随机数据会失败基于时钟这类范围有限的源也会失败结果是伪安全而种子的厚度决定整串输出的厚度官方那个8 位种子配 128 位密钥的例子与本机上同一种子两次输出逐位一致的实测是同一件事的两面。要真正猜不到就得落到操作系统提供的熵源上——内核随机设备是源系统调用与用户态 API 是同一件事的两层入口选择的那一刻官方文档也把话说明白了要安全用secrets一类random自己写了它只做建模与仿真。到了 UUID 这种带规范的东西上规范用的词是应当使用 CSPRNG还提醒进程 fork 之后要正确重新播种。所以问题从来不是你能不能自己写一个随机数而是你有没有先问清楚这个值要不要猜不到。配套资料把全文的两种尺子、种子命门、熵源三层、库函数怎么选、UUID 与 CSPRNG收成一页速查卡连同这份自查清单放在资料包里扫码即可获取本章可以带走的一句把要不要猜不到当成第一问再顺着种子 → 熵源三层 → 库函数 → 规范要求一路核下去随机数就不再是一个可以随手写下的词。附表 A本文引用事实与官方出处对照表#事实一句出处来源名 具体位置核验日期本文位置1伪随机过程生成用于保密的量会导致伪安全对手复现出产生它的环境后可能比在完整空间里搜更省力RFC 4086 AbstractBCP 1062026-10-14第 2 章2一切密码系统的核心是生成保密的、猜不到的数字缺少真正不可预测的源是密码学软件设计的开放伤口只过统计检验或基于时钟这类有限源会失败RFC 4086 §12026-10-14第 2 章3128 位密钥若由固定伪随机生成器配 8 位种子导出对手只需搜 256 把而非 2^128 把密钥里只有 8 位信息RFC 4086 §32026-10-14第 3 章4同一种子两次取random.random()得到完全一致的序列secrets.token_hex(8)两次结果不同Python 3.13.12本机实测Python 脚本2026-10-14 本机实测第 3 章5random设备产出均匀分布、质量可能很高的随机字节getentropy(2)对文件描述符耗尽、chroot、沙箱更有韧性arc4random(3)建立在random数据源之上且比直接访问系统随机设备更受推荐macOSman 4 random2026-10-14第 4 章6随机设备实现 Fortuna 算法并维护熵池/dev/urandom是对 Linux 的兼容让步其后一段是手册描述 Linux 的内容macOSman 4 random2026-10-14第 4 章7本机/dev/random与/dev/urandom均为字符设备属性以c开头属主root wheel本机实测ls -l /dev/random /dev/urandom2026-10-14 本机实测第 4 章8secrets生成密码学强度的随机数适用于口令、账号认证、安全 token 等应优先于random的默认伪随机生成器后者为建模与仿真设计Python 官方文档 ·secrets2026-10-14第 5 章9random模块的伪随机生成器不应用于安全目的完全不适合密码学用途randbytes不应生成安全 tokenPython 官方文档 ·random2026-10-14第 5 章10截至 2015 年32 字节256 位随机性足以覆盖secrets典型用例标准随算力提高而提高Python 官方文档 ·secretsHow many bytes should tokens use?2026-10-14第 5 章11本机secrets.DEFAULT_ENTROPY为 32是token_*系列未指定长度时默认使用的量本机实测secrets.DEFAULT_ENTROPY2026-10-14 本机实测第 5 章12UUIDv4 用于从真随机或伪随机数生成 UUID实现可取 122 位随机位填入各字段RFC 9562 §5.42026-10-14第 6 章13实现应当使用 CSPRNG 提供难预测且低重复的值并须在进程 fork 等状态变化后正确重新播种RFC 9562 §6.92026-10-14第 6 章14getentropy(2)的调用形状示意为形状说明未在本机编译运行标注代码待验证本文说明2026-10-14第 4 章附表 B术语速查表术语一句话解释易混点伪随机由一个确定的初始状态、按确定规则长出来的数列“看起来乱不等于猜不到”这是全文的分岔口密码学随机 / CSPRNG为猜不到设计的随机源通常接到操作系统熵源它也是伪随机区别在那句密码学安全的限定熵源操作系统用来收集不可预测性的那套底层来源它才是真正不可预测通常落脚的地方种子伪随机生成器的初始值种子有多薄输出就有多薄可复现是它的设计目标“伪安全”RFC 4086 给的词用伪随机过程生成保密量的后果对手只要复现产生它的环境就能把空间缩小/dev/random、/dev/urandom系统上读取随机字节的两个设备名两者在 Linux 上的关系不在本文结论范围内getentropy(2)、arc4random(3)取随机字节的系统调用接口以及建立在系统随机源之上的用户态生成器官方更推荐用它们而不是直接访问系统的随机设备secretsPython 里为保密设计的随机模块文档明说它应优先于random的默认生成器randomPython 里为建模与仿真设计的伪随机模块官方警告它不应被用于安全目的UUIDv4用真随机或伪随机数生成的 UUID规范要求应当使用 CSPRNG并注意重新播种重新播种在进程 fork 等状态变化后重设 CSPRNG 内部状态不做这件事副本之间可能行动一致写在最后这篇用到的资料写这篇文章时我把自己脚本里那句随手取个随机数重新拆了一遍发现真正要问的不是用哪个函数而是这个值要不要猜不到——一旦问出口种子、熵源、库函数、规范要求就都串成了一条线。顺手也整理了几份配套的东西靶场环境对照表DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径Web 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看环境对照表那一份它按哪一层出问题、用哪一把尺子整理跟本文先问要不要猜不到、再顺着链子往左核是一条线。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑