随机数生成最安全的种子是什么?

时间:2010-08-08 22:43:52

标签: security cryptography random

为随机数生成器播种的最安全的熵源是什么?此问题与语言和平台无关,适用于网络上的任何计算机。理想情况下,我正在寻找托管公司提供的云环境或服务器中可用的源。

要记住两个重要的弱点。使用时间发送随机数生成器违反了CWE-337。使用小种子空间将违反CWE-339

20 个答案:

答案 0 :(得分:82)

答案 1 :(得分:48)

最安全的种子是具有最高熵级别(或无法预测的大多数位数)的种子。时间通常是一个糟糕的种子,因为它有一个小的熵(即如果你知道交易何时发生,你可以猜到时间戳在几位内)。硬件熵源(例如来自衰变过程)非常好,因为它们为每一粒种子产生一位熵。

通常硬件来源对于大多数需求来说是不切实际的,因此这会导致您依赖混合大量低质量熵源来生成更高的熵源。通常,这是通过估计每个样本的熵位数然后收集足够的样本来完成的,这样熵源的搜索空间足够大,以至于攻击者搜索是不切实际的(128位是一个很好的经验法则) )。

您可以使用的一些来源是:以微秒为单位的当前时间(通常非常低的1/2熵,具体取决于分辨率以及攻击者猜测的容易程度),UI事件的到达时间等。

/ dev / random等操作系统源和Windows CAPI随机数生成器通常提供这些低熵源的预混合源,例如Windows生成器CryptGenRandom包括:

  • 当前进程ID(GetCurrentProcessID)。
  • 当前线程ID(GetCurrentThreadID)。
  • 启动时间后的滴答计数(GetTickCount)。
  • 当前时间(GetLocalTime)。
  • 各种高精度性能 计数器(QueryPerformanceCounter).-
  • 用户环境的MD4哈希值 块,包括用户名, 计算机名称和搜索路径。 [...] -
  • 高精度内部CPU计数器,例如RDTSC,RDMSR,RDPMC

一些PRNG具有内置策略,允许混合来自低质量源的熵以产生高质量结果。一个非常好的生成器是Fortuna生成器。它专门使用策略来限制风险,如果任何熵源被泄露。

答案 2 :(得分:14)

最安全的种子是一个真正随机的种子,你可以通过使用它来近似于今天的实际计算系统,以降低的置信度列出:

  • 特殊硬件
  • 您的操作系统提供的设施,用于捕获磁盘读取和鼠标移动(/ dev / random)等混乱事件。这个“捕获不可预测事件”行的另一个选择是使用一个独立的进程或机器来捕获它作为熵池发生的事情,而不是操作系统提供的“安全”随机数生成器,例如,见{{3} }
  • 使用错误的种子(即时间)并将其与您只知道的其他数据相结合(例如,使用秘密和其他一些标准(例如PID或应用程序/操作系统的内部状态)对时间进行散列,因此它不一定按时间增加和减少)

答案 3 :(得分:7)

作为对一次性打击垫的有趣看法,每当我从事间谍活动时,我都有一个系统,我只需要传达几个字母。例如,我最后一次出售秘密计划为Grand Fenwick公爵建造烤面包机时,我只需要低声说:

  

enonH

我的同盟者。她知道得到http://is.gd/enonH-(这是一个“安全”的扩展程序网址,它会将您带到is.gd扩展页面,该页面又指向青蛙的完全SFW图像)。这给了我们409k位的一次性填充或者 - 如果我在低声说“enonH”时眨眼 - 她知道采取图像的散列并将其用作我下次传输的解码密钥。

由于JPEG图像中的压缩,它们往往是ent报告的相对较好的熵源:

  

$ ent frog.jpg
  熵= 7.955028位   每个字节。

     

最佳压缩会减少   此51092字节文件的大小为0   百分比。

     

Chi square分布为51092   样本是4409.15,并且是随机的   超过这个值的0.01%   次。

     

数据字节的算术平均值是   129.0884(127.5 =随机)。
  Pi的蒙特卡罗值为3.053435115(错误   2.81%)   串行相关系数为0.052738(总计   uncorrelated = 0.0).uncorrelated = 0.0)。

将这与我引导她几乎不可能猜到的图像相结合,我的秘密烤面包机计划对The Man来说是安全的。

答案 4 :(得分:6)

Linux机器上的答案是/dev/random。这非常接近“真实”随机数生成器,如果熵池干涸,则PRNG可以生成/dev/urandom 。以下引用取自Linux kernel's random.c这整个文件是一个很好的阅读,很多评论。它自己的代码来自PGP。它的美丽不受C的约束,它受到访问者包裹的全局结构的影响。这是一个简单令人敬畏的设计。

  

这个例程收集了环境   来自设备驱动程序等的噪音   返回好的随机数,合适   用于加密用途。除了   明显的加密用途,这些   数字也适合播种   TCP序列号等等   希望有的地方   数字不仅是随机的,而是   很难被攻击者预测。

     

操作理论

     

计算机是非常可预测的设备。因此,这是非常困难的   在a上产生真正的随机数   电脑---而不是
  伪随机数,可以   通过使用一个容易生成   算法。不幸的是,它非常   攻击者很容易猜到   伪随机数序列   发电机,对于一些人   申请这是不可接受的。   相反,我们必须努力聚集   来自“环境噪音”   计算机的环境,必须   外部攻击者很难   观察,并用它来生成   随机数。在Unix中   环境,这是最好的完成   在内核中。

     

来自环境的随机性来源包括键盘间   时间,中断时间来自   一些中断和其他事件   这两者都是(a)非确定性的   (b)外部观察员很难   测量。这些随机性   来源被添加到“熵   池“,使用类似CRC的混合   功能。这不是   密码学强,但确实如此   足够假设随机性   没有恶意选择,而且速度很快   这样做的开销就足够了   每次打断都很合理。   随机字节被混合到   熵池,惯例保持   估计多少位   随机性已被存储到   随机数发生器的内部   状态。

     

当需要随机字节时,通过取SHA来获得它们   哈希的内容“熵   池“.SHA哈希避免暴露   熵的内部状态   池。据信是   计算上不可行的   任何有用的信息   从输出中输入SHA。即使   可以分析SHA中的   一些聪明的方式,只要量   从发电机返回的数据   小于固有的熵   池,输出数据是完全的   不可预知的。出于这个原因,   常规减少其内部   估计多少位“真实   随机性“包含在   熵池,因为它输出随机   数字。       如果该估计值为零,则例程仍然可以随机生成   数;然而,攻击者可能(在   至少在理论上)能够推断   发电机的未来输出   从先前的产出。这需要   成功的SHA密码分析   不被认为是可行的,但是   有一个遥远的可能性。尽管如此,这些数字应该是   对绝大多数人有用   目的。

     

...

答案 5 :(得分:4)

编写Internet广播客户端,使用广播中的随机样本。有几个车站可供选择和/或回退。

答案 6 :(得分:3)

詹姆斯是对的。此外,您可以购买可以随机提供数据的硬件。不确定我在哪里看到它,但我想我读过一些声卡带有这样的硬件。

您还可以使用http://www.random.org/

等网站

答案 7 :(得分:3)

如果你读到加密理论,很明显最安全的种子将是由混乱事件产生的种子。在最近的历史中,秘密行动已经利用了所谓的"One-time pad",这被证明是无法破解的。通常情况下,这些是通过散布在不知名的中间的各种大气听力帖子产生的。大气噪声足够混乱,被认为是随机的。这种方法的主要问题是一次性垫的物流是相当可观的。

我的建议是找到一个足够混乱的事件以某种方式从中提取数据。

答案 8 :(得分:2)

好的,假设客户端需要强大的种子,并且您正在使用云计算,这是一个解决方案,对于某些硬件随机数生成器,您可以在这里查看:

http://en.wikipedia.org/wiki/Hardware_random_number_generator

因此,假设每个客户端都有一个公钥/私钥对,服务器知道每个客户端的公钥。 要生成一个键,你可以使用与PGP相似的东西,在开始时,你可以将键击之间的时间差看作某些类型,因为这是不可猜测的。

因此,客户端提交随机数请求。 服务器使用硬件生成器,使用公钥对其进行加密,并使用服务器的私钥对其进行签名。 然后,客户端可以验证它的来源,然后对其进行解密。

这将确保您可以生成随机数并以安全的方式将其传回。

<强>更新

您最好的选择是查看计算机编程艺术或任何数值方法书籍,或查看Bruce Schneier撰写的内容,例如以下链接: http://www.schneier.com/blog/archives/2006/06/random_number_g.html http://www.cryptosys.net/rng_algorithms.html http://www.schneier.com/blog/archives/2006/06/random_number_g.html http://www.schneier.com/blog/archives/2006/06/random_number_g.html 软件中随机数生成的建议,ftp://ftp.rsasecurity.com/pub/pdfs/bull-1.pdf

你也可以看看让Crypto ++做这一代,或者至少看看魏戴是怎么做到的,http://www.cryptopp.com/

答案 9 :(得分:2)

Random.org提供了一个真正的随机数生成器web service,“播种”了大气噪音。

每天免费获得200,000个随机位,最多100万个随机位上限,之后你应该充值你的账户,它的价格便宜到每美元400万比特。

答案 10 :(得分:2)

4 - 由非常随机的骰子卷选择。 : - )

答案 11 :(得分:1)

使用Linux,答案是/ dev / random(在Windows中我认为等效项称为CryptGenRand)。

但是,在云环境中,/ dev / random可能会严重耗尽,并且可能没有足够的熵来回答您的请求。

为了解决这个问题,我们公司正在开发一种真正的随机数发生器设备,可以同时为数千台服务器和VM提供良好的随机数(量子来源)。如果设备安装在云数据中心的LAN中,您只需要在计算机上运行我们的守护程序即可。该守护程序监视/ dev / random熵级别,当需要熵时,向设备发出请求(通过网络)并将接收到的随机数据放入内核的熵池中。

如果您想了解更多有关我们解决方案的信息,请访问我们的网站(www.sqrtech.com)或通过info@sqrtech.com与我们联系。

于连

答案 12 :(得分:1)

您可以获得放射性衰变产生的随机数。起初听起来有点奇怪,但是你可以得到真正的随机数字。

Radioactive Decay

Another Article

答案 13 :(得分:1)

使用random.org声称为互联网上的任何人提供真正的随机数,并且他们还有一个可以使用的HTTP API。他们提供免费和付费服务。

免责声明:我与random.org没有任何关联

答案 14 :(得分:1)

您最安全的方法将来自大自然。也就是说,某些事情发生在您的计算机系统之外,超出了我们预测其模式的能力。

例如,Cryptographically secure PRNGs的许多研究人员将使用放射性衰变作为模型,其他人可能会研究分形,等等。现有creating true RNGs

的方法

我最喜欢的实施PRNG的方法之一是用户与计算机的互动。例如,这篇文章不是可以通过前一系列帖子中的前向工程预先确定的。我将鼠标放在屏幕上的位置非常随机,它所做的踪迹也是随机的。从用户交互看,是。通过使用“swarm”用户输入并计算它的“向量”,可以通过提供特定输入的方式滥用,以便生成特定数字,只要您没有系统中的每个用户作为前夕,您应该没事。这不适用于许多应用程序,因为您的数字池与用户输入成正比。实现这一点可能有它自己的问题。

对RNG感兴趣的人已经做过以下事情:

  1. 使用网络摄像头,无论屏幕上的随机光点如何,当卡车经过时,都是随机数据。
  2. 如上所述,辐射
  3. Atmosphere
  4. 用户互动(如上所述)
  5. What's going on within the system EDG。
  6. 安全种子来自大自然。

    编辑: 根据您正在进行的操作,我建议您使用云服务器EDG的聚合。

答案 15 :(得分:1)

首先,您需要定义随机数生成器的实际用途/目的,为什么您认为必须通过如此高的安全标准?我问的原因是你提到从罐头中挑选它 - 如果你确实是出于安全目的使用它,那么保护源和通道发送它比任何人的学术编织都要重要得多。

第二个元素是你需要的实际随机数的大小 - 大种子是好的,但只有当生成的数量也很大时 - 否则你只是阅读生成的数字的一小部分,这将增加你的风险。

查看可重新配置的密码,而不是SHA或AES。如果您想阅读并验证它们的工作原理和原因,这里有2篇研究论文:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.97.6594&rep=rep1&type=pdf http://www.springerlink.com/index/q29t6v1p45515186.pdf

或者抓住你在网上找到的任何可重新配置的GOST密码源代码然后你只需要提供任何基本种子(比如连接的“ticker”加上一个web服务器节点ID(如果它在web场中)加上一个部分任何互联网新闻网站上的回复都会随时更改热门新闻,或者您可以为其提供高度可控的初始种子(您可以自行制作)并使用轻型伪随机序列来选择更多的密码配置。甚至NSA也可以打破那一个:-)因为它始终是一个不同的密码。对于实际的加密目的,实际上必须使用非常受控的初始种子才能够复制序列以进行验证。这就是我们回到第一个项目的地方 - 确保来源和分发。

答案 16 :(得分:1)

由于共识是密码学上强大的随机数必须从硬件中获得。有些处理器具有此功能(英特尔芯片是其他处理器)。此外,通过测量a-d转换器中的低位波动,可以使用声卡。

但是由于硬件需求,没有语言和平台独立的答案。 几乎任何更大的操作系统都会支持安全的随机数。实现具有良好输出的良好随机数生成器也很棘手,因为您必须跟踪池中的剩余熵。

因此,第一步是确定您将使用的语言。 有些确实具有强大的随机数支持 - 如果不是这种情况,则必须抽象生成以调用依赖于平台的随机源。

根据您的安全需求,对“在线”消息来源感到厌倦,因为对于未经身份验证的在线消息来源,中间人可能是一个严重的威胁。

答案 17 :(得分:1)

如果没有额外的随机硬件可以使用简单的解决方案。

使用毫秒,mouseX和mouseY生成种子。

答案 18 :(得分:0)

(((PI X当前线程ID)X当前进程ID)/ tick计数)x pi

答案 19 :(得分:0)

这是一个GUESS!如果我错了,加密极客请纠正

此时UUID / GUID的官方算法返回通过加密哈希函数运行的结果 - 它使用已知信息(如time,mac addr和计数器)来形成UUID / GUID然后运行此通过加密哈希来确保无法提取mac地址。

我相信你可以将它降低到种子所需的位数,并且相当好地保证结果值在你想要的位数定义的数字空间上均匀分布。注意我并不是声称这是安全的,只是这个动作应该产生一个随时间均匀分布在位空间的值。