Linux的熵来源


9

假设我要从/ dev / random中获取一千兆字节左右的随机数据,适合一次填充(因此/ dev / urandom消失了。)如何为我的/ dev / random注入足够的熵来做到这一点?我正在为此寻找特定的命令和程序。我不想买任何东西。我正在使用Arch Linux,如果有帮助的话。


这样的程序会不会将/ dev / random变成与您不想使用的/ dev / urandom相同的问题?还是您指的是某些从设备或网络中获取额外信息的东西?
Anthon 2015年

@Anthon我正在谈论从熵源中提取随机性的特定程序,例如散粒噪声,热噪声,某些设备等。该程序本身不会产生随机性。
PyRulez 2015年

...例如,说的命令或程序,Here — type something:然后以比人所能控制的精度更高的精度来测量击键之间的时间增量?
G-Man说'恢复莫妮卡'


1
它提到一次性填充是以下断言之一,即_'...几乎所有密码算法...“仅”提供计算安全性”。除非您能引用我错过的内容,否则它会说一次性垫不能使用urandom?
2015年

Answers:


4

两个方案可以增加熵池,而不需要额外的硬件是rng-toolshavegedrng-tools使用现代CPU和芯片组中可用的RNG,haveged使用现代CPU随机性(缓存行为等)。两者都可以在Arch中使用,并且Arch Wiki上有一个有趣的页面来讨论它们。我没有尝试使用它们来生成千兆字节的数据,但是应该在合理的时间内完成。

您明确地排除了购买任何东西,但是出于完整性的考虑,LWN中有一篇有趣的文章涉及NeuG的熵,其中包括讨论haveged和其他各种方法。您可以以不到10美元的价格购买能够运行NeuG的STM8S板,或以35美元的价格购买FST-01。


4

不幸的是,/ dev / random也不适用于一次性垫板,至少不适合大多数人在考虑或实施一次性垫板时想到的那种一次性垫板(具有可证明的安全性保证)。以下大多数信息摘自http://www.2uo.de/myths-about-urandom/上的(很长)文章

问题是/ dev / random不是真正随机的。它使用CSPRNG生成其输出。实际上,/ dev / random使用与/ dev / urandom完全相同的CSPRNG。唯一的区别是,如果/ dev / random的内部熵估计不足,则会阻塞。

前一句中的“估计”一词是关键。大多数人认为此估算始终是准确和完美的,但实际上并不完全准确。估计错误的那一刻,您将失去一次性保护垫的所有可证明的安全保证,而剩下的只是计算安全性-这比使用/ dev / urandom更好!

使熵估计有点错误并不会使您的一次性垫子有点不安全。一次性垫可证明的安全保证是全部或全部。

这个问题的前提是可以通过添加更多的熵来“解决” / dev / random问题。不幸的是,这个前提是错误的。恶意的熵源要比根本没有熵差得多,因为熵源通常可以访问内部数据,并且可以使用RNG输出秘密导出此数据-请参阅http://blog.cr.yp.to/20140205-entropy .html进行完整的讨论(在此不胜枚举)。特别是,从安全的角度来看,熵的硬件来源(如其他几个答案所建议的)是一个非常糟糕的选择,因为该硬件处于处理恶意行为的首要位置,并且基本上是不可审计的。


我并不是说我正在用更大的熵来修复它,我只是需要更多才能获得更大的密钥。尽管这是有缺陷的,但这是一个很好的观点。您能推荐其他选择吗?
PyRulez 2015年

1
除了关于硬件来源的最后一点以外,这是一个很好的答案。熵的硬件来源是获取熵的唯一可靠且可审核的方法。您(或您信任的人)确实需要审核源-这需要拥有设计信息并验证制造过程是否遵守设计信息。您甚至可以合并熵源,以便如果其中至少一个很好,那么结果就很好(注意,您需要为此正确地合并它们)。
吉尔(Gilles)'所以

吉尔斯,请阅读我发布的第二个链接。声称如果至少有一个熵源是好的,那么结果是好的是完全错误的。该链接的全部目的是反驳这一虚假主张!
djao 2015年

而且,仅审计源和制造过程是不够的。您需要审核您的单个设备,以确保您的设备是根据制造过程制造的。这比软件中的类似任务要困难得多,后者仅包含检查校验和。
djao 2015年

至于替代方案:没有其他替代方法可以从PC中提取1GB随机数据。为此,您将需要一个硬件设备(但是请注意我所说的关于硬件难以审核的内容)。如果您愿意使用/ dev / random,那么/ dev / urandom也是一样。对于所有加密应用程序而言,这并不比/ dev / random差。
djao 2015年

3

似乎硬件组件是最好的主意。那里有一些硬件发生器IC,但是当它们出现时,您必须信任它们。

可能两个不错的解决方案是诱导组件产生噪声。两种主要的解决方案似乎是温度偏差和二极管产生的avanche噪声(请参阅http://web.archive.org/web/20061117145903/http://willware.net:8080/hw-rng.html

随着陀螺仪和加速度计等组件变得越来越敏感,使它们以最高灵敏度工作,并且使用其LSB值也是一个不错的解决方案,但AFAIK对此没有人进行审核。

有趣的是,关于不使用RNG的论文很多,但是没有公开和验证过的硬件实现


2

您可以使用pycsprng.py。密码安全吗?我不太确定,但我想进行同行评审。

python pycsprng.py | pv | dd of=data.file bs=1024 count=1000

管道pv是可选的,只会帮助您了解已传输了多少数据。

您可能会发现,较大的块大小(bs)可提高性能。如果增加块大小,则必须调整计数以不生成太大的文件。


3
那只是使用/dev/urandom...
Stephen Kitt

1
pycsprng.py从字面上看是10个SLOC脚本,可从中获取随机性os.urandom文档说:“对于密码应用程序,返回的数据应该足够不可预测[...]在类似UNIX的系统上,它将进行查询/dev/urandom它确实做到了(虽然它已经过时了),但Security.SE表示对于加密来说可以
gronostaj

没有一个时间垫加密!
PyRulez

0

当您不插入麦克风时,从模拟麦克风通道获得的信息通常只是静态的。例如,将其通过bzip2进行管道传输以进行美白,然后将其与其他随机性源(urandom或另一个麦克风插孔)混合,或者将结果通过openssl进行管道传输以获得良好的测量效果,并且得到的结果应该是相当随机的。

但是,将很难证明有关结果随​​机性的任何硬性和快速性安全性。


0

如果您在amd64 / x86_64处理器,虚拟或物理环境上使用Linux内核2.6.9或更高版本,则可以尝试ncomputers.org/pandom一个真正的随机数生成器,该生成器通过64位ubits / 64位提供8 KiB / s的熵通过/dev/random

样本输出


链接已断开,找不到备份。
slm

0

要生成100 MB的硬件生成的随机数据,您可以:

  • 使用计算机的内置麦克风(笔记本电脑上提供)录制20分钟的音频(96khz 16bit单声道)。您将获得〜220 MB WAV文件。

  • 丢弃一些无用的位,并用一些数学方法将二进制数据的位进行混洗(许多方法可以这样做)

  • 将改组后的位导出为〜100 MB二进制文件

这是有关此的文章:尝试使用音频(和计算机的内置麦克风)生成真实的熵和随机数据

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.