Random 快速、安全的随机数
我正在寻找一个比Random 快速、安全的随机数,random,openssl,blowfish,entropy,Random,Openssl,Blowfish,Entropy,我正在寻找一个比/dev/uradom更快的替代方案,突然发现了一个有趣的小道消息: 生成非常好的非随机但近乎随机的位的一个好技巧是使用/dev/random的熵来播种一个快速对称流密码(我最喜欢的是blowfish),并将其输出重定向到需要它的应用程序 这不是一个初学者的技巧,但是使用两行或三行shell脚本和一些创造性的管道很容易设置 进一步的研究得出了Schneier关于安全性的评论: 如果你打算“注入熵”,有很多方法可以做到这一点,但更好的方法之一是通过高速流密码“传播”熵,并将其与非确
/dev/uradom
更快的替代方案,突然发现了一个有趣的小道消息:
生成非常好的非随机但近乎随机的位的一个好技巧是使用/dev/random的熵来播种一个快速对称流密码(我最喜欢的是blowfish),并将其输出重定向到需要它的应用程序
这不是一个初学者的技巧,但是使用两行或三行shell脚本和一些创造性的管道很容易设置
进一步的研究得出了Schneier关于安全性的评论:
如果你打算“注入熵”,有很多方法可以做到这一点,但更好的方法之一是通过高速流密码“传播”熵,并将其与非确定性采样系统耦合
如果我错了,请纠正我,但从速度和安全性方面来看,这种生成随机位的方法似乎比/dev/uradom
要好
下面是我对实际代码的看法:
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的零,并使用blowfish加密,其密钥为448位,由伪随机、可打印字符组成。以下是我的上网本上的输出:
中的400+0记录
400+0记录输出
已复制419430400字节(419 MB),14.0068秒,29.9 MB/s
真实0m14.025s
用户0m12.909s
系统0m2.004s
太好了!但它有多随机?让我们通过管道将结果传输到ent
:
熵=每字节8.000000位
最佳压缩将减小尺寸
此419430416字节文件的0%
419430416个样本的卡方分布为250.92,且为随机分布
将超过该值的50.00%
数据字节的算术平均值为127.5091(127.5=随机)。
Pi的蒙特卡罗值为3.141204882(误差0.01%)。
序列相关系数为-0.000005(完全不相关=0.0)
看起来不错。但是,我的代码有一些明显的缺陷:
/dev/uradom
作为初始熵源/dev/uradom
、sfill
、badblocks
或DBAN,请分享您用于安全擦除磁盘的内容
谢谢大家!
编辑:更新了将blowfish用作流密码的代码。如果您只是想安全地擦除磁盘,那么您真的不必担心写入数据的随机性。重要的是尽可能多地写信——也许几次。除非你的“对手”是一个大型政府组织,有足够的资源来沉迷于数据恢复,否则任何比这多得多的东西都是杀伤力过大的(而且现在还不清楚他们是否能够读取数据,因为现在使用的磁盘密度已经不高了)。我曾经使用过GNU的“shred”程序,但我只是偶尔关心一下。当我这样做时,我将一个磁盘系统格式化到磁盘驱动器上,然后用一个包含准随机数据的文件填充它,然后将其切碎。我认为这基本上是矫枉过正
也许你应该读施奈尔的书?你会对FreeBSD上的urandom手册页感兴趣。Yarrow算法听起来确实很有希望。肯定比我现在做的更安全。你有“ent”程序的URL吗?。我还建议。河豚不是一种流密码,您也不能在类似流密码的模式下使用它,例如计数器模式。NIST SP 800-90包含了各种各样的结构来实现这一点。我同意使用随机数据来安全地擦除磁盘是一种过分的做法。你只需做一次
/dev/zero
,就可以非常安全地抵御非百万富翁的攻击者。然而,如果我买了一个2TB的硬盘,并想对它进行加密,我必须首先用随机数据填充它。谢谢你的书,我会查的。