#operating-system #entropy #secure-random #userspace #numbers #randomness #generated

userspace-rng

通过在用户空间生成熵,提供安全的随机数

6 个版本 (2 个稳定版)

1.0.3 2023年2月5日
1.0.1 2023年1月27日
0.1.6 2023年1月23日
0.1.2 2022年11月28日

#894 in 加密学

Download history 9/week @ 2024-03-18 25/week @ 2024-04-01 8/week @ 2024-04-08 57/week @ 2024-04-15 14/week @ 2024-04-22 14/week @ 2024-04-29 5/week @ 2024-05-06 13/week @ 2024-05-13 3/week @ 2024-05-20 14/week @ 2024-05-27 11/week @ 2024-06-03 12/week @ 2024-06-10 7/week @ 2024-06-17 13/week @ 2024-06-24 25/week @ 2024-07-01

57 次每月下载
用于 3 个crate(2个直接使用)

MIT 协议

31KB
349 代码行

userspace-random

userspace-random 是一个 Rust crate,旨在即使在操作系统熵不安全的情况下,也能为调用者提供安全的熵。 userspace_rng::Csprng 实现 rand_core::CryptoRngrand_core::RngCore

用法

// Generate an ed25519 key.
let mut rng = userspace_rng::Csprng{};
let keypair = ed25519_dalek::Keypair::generate(&mut rng);

// Generate 32 bytes of randomness.
let rand_data = userspace_rng::random256();

现代操作系统如 Linux、Mac 和 Windows 都会提供可靠的熵,然而更小众的操作系统和环境通常会给用户提供损坏的 RNG。这种担忧在物联网和嵌入式硬件中尤为重要,工程师们为了减少操作系统和硬件的大小和开销,故意采取了许多捷径。结果可能是无意中损害了操作系统的 RNG,这可能会让用户面临风险。

这种担忧是有先例的。当 Android 更新时,Android 中损坏的 RNG 使用户资金面临风险:https://bitcoin.org/en/alert/2013-08-11-android

为了保护用户不受不安全硬件的影响,我们开发了一个库,该库在用户空间生成可靠的熵。我们构建了这个库,以确保只有当操作系统 RNG 损坏且我们的库的假设不正确时,随机性才可能被破坏。如果 Android 钱包使用 userspace-random 来生成它们的熵,那么尽管 Android 本身存在缺陷,用户资金可能仍然是安全的。

这个库从 CPU 振荡中抽取熵。具体来说,完成加密散列函数所需的纳秒数具有很高的变化量。我的测试表明,在正常情况下,变化量约为 100 纳秒,标准差约为 40 纳秒。这表明,将加密散列函数中经过的时间作为熵的来源,每次测量可以提供 4 到 6 比特的熵。

当库启动时,它执行25毫秒的哈希运算,总共至少执行512次哈希操作。这理论上提供了超过2000位的熵,这意味着库提供了足够的安全余量。即使是更稳定、更可靠的硬件,也应该因为CPU的物理限制,每次哈希操作至少产生1/4位的熵。

为了简要说明:CPU是一个消耗电力并产生热量的物理设备。CPU运行的速度(至少,在我们的当前技术中)惊人地依赖于电压和温度等因素。此外,这些因素在CPU执行计算时往往会迅速变化。经验测量表明,这种变化足够显著,足以导致加密哈希操作的执行总时间产生实质性差异。操作系统背景活动等其他因素也可能发挥作用。

为了娱乐,这个库还融入了一些来自Fortuna论文的思想,以保护用户免受能够利用旁路通道攻击用户熵的对手。实际上,这些额外的选择可能不是保护现实世界攻击者所必需的。Fortuna是为与这个库面对的威胁模型完全不同的威胁模型而设计的。

Fortuna论文:https://www.schneier.com/wp-content/uploads/2015/12/fortuna.pdf

依赖关系

约0.6–1MB
约21K SLoC