6 个版本 (2 个稳定版)
1.0.3 | 2023年2月5日 |
---|---|
1.0.1 |
|
0.1.6 |
|
0.1.2 | 2022年11月28日 |
#894 in 加密学
57 次每月下载
用于 3 个crate(2个直接使用)
31KB
349 代码行
userspace-random
userspace-random 是一个 Rust crate,旨在即使在操作系统熵不安全的情况下,也能为调用者提供安全的熵。 userspace_rng::Csprng
实现 rand_core::CryptoRng
和 rand_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