/dev/urandom
当我偶然发现这个有趣的花絮时,我正在寻找一种更快的替代方法:
生成非常好的非随机但几乎随机位的一个好技巧是使用 /dev/random 的熵来播种快速对称流密码(我最喜欢的是河豚),并将其输出重定向到需要它的应用程序。
这不是一种初学者技术,但使用两行或三行 shell 脚本和一些创意管道很容易设置。
Schneier 对安全性的进一步研究得出了这样的评论:
如果您要“注入熵”,有很多方法可以做到这一点,但更好的方法之一是将其“传播”到高速流密码中,并将其与非确定性采样系统相结合。
如果我错了,请纠正我,但这种生成随机位的方法似乎比/dev/urandom
速度和安全性要好。
所以,这是我对实际代码的看法:
time dd if=/dev/zero bs=1M count=400 | openssl bf-ofb -pass pass:`cat /dev/urandom | tr -dc [:graph:] | head -c56` > /dev/null
此速度测试需要 400MB 的零,并使用带有由伪随机可打印字符组成的 448 位密钥的河豚对其进行加密。这是我上网本的输出:
400+0 条记录 400+0 条记录 419430400 字节 (419 MB) 复制,14.0068 秒,29.9 MB/秒
真实 0m14.025s 用户 0m12.909s 系统 0m2.004s
那太棒了!但它有多随机?让我们通过管道将结果发送到ent
:
熵 = 每字节 8.000000 位。
最佳压缩会将此 419430416 字节文件的大小减少 0%。
419430416 个样本的卡方分布为 250.92,随机超过该值的概率为 50.00%。
数据字节的算术平均值为 127.5091(127.5 = 随机)。Pi 的 Monte Carlo 值为 3.141204882(误差 0.01%)。序列相关系数为 -0.000005(完全不相关 = 0.0)。
这看起来不错的样子。但是,我的代码有一些明显的缺陷:
- 它
/dev/urandom
用于初始熵源。 - 密钥强度不等于 448 位,因为只使用可打印字符。
- 密码应定期重新播种以“散布”熵。
所以,我想知道我是否走在正确的轨道上。如果有人知道如何修复这些缺陷中的任何一个,那就太好了。另外,如果不是/dev/urandom
、sfill
、badblocks
或 DBAN,您能否分享您用来安全擦除磁盘的内容?
谢谢!
编辑:更新代码以使用河豚作为流密码。