编辑让问题更具体:
程序可以/dev/urandom
在云中的 Ubuntu LTS VM 上以至少 1MB/秒的速率读取提供高质量、加密强度高的随机数吗?或者是否有任何我需要采取的陷阱考虑在内?
原来的:
我需要编写一个提供随机数的组件,满足多个条件:
- 它必须生成统计上独立、线性分布的数字,并通过行业标准统计随机性测试。
- 该算法必须被视为“加密强度高”。
- 它必须足够快。
- 目标系统将是在云中虚拟化的 Ubuntu LTS。
我正在考虑使用从中读取的数字/dev/urandom
而不是使用真正的(硬件)RNG(例如这)或编写 CSPRNG 代码。我收集的信息(见下文)似乎表明这是一种有效的方法,但我想确保我没有遗漏任何内容。
根据Linux 随机数生成器的文档和分析第 8.2 节:
测试表明,为 /dev/random 和 dev/urandom 生成随机数的输出函数生成的数据表现出理想随机数生成器的特征。因此,没有发现会减少随机数熵的实施错误。
这似乎满足第一个要求。根据维基百科引用的资料,Linux 内核使用恰恰20生成数据的算法
/dev/urandom
从4.8版本。该算法通常被认为是“加密安全的”。
这似乎满足了第二个要求。我没有可用的 Ubuntu 系统,但我
{ timeout --foreground 1s cat /dev/urandom; } | wc -c
在我的 M1 Mac 上运行,它报告约为 200MB/s,这对于我的要求来说已经足够快了。运行相同在线的速度快了 2.5 倍。
一个小型 C++ 程序使用低级read()
调用重复填充 40KB 缓冲区/dev/urandom
,实现了约 1GB/s 的速度。我无法getrandom()
在 Mac 上进行测试,但对 Gotbolt 的快速检查表明,对于相同的缓冲区大小,两种方法的性能大致相同。
这似乎满足了第三个要求。这文章表明加速改进来自内核版本 5.17(以及 5.18 中的进一步改进),这意味着它们已经在 Ubuntu 22.04.2LTS(使用版本 5.19 的内核)中。
我是否遗漏了任何注意事项?