使用计算机随机数生成器生成密钥,是否安全?

信息安全 密码学 加密 。网 随机的
2021-09-02 19:05:13

使用计算机上的随机数生成器生成加密密钥是否存在安全风险?如果是这样,如何减轻这种风险,特别是在 .Net 中生成 RSA 密钥对时?

4个回答

使用计算机随机数生成器生成密钥,是否安全?

这取决于您的威胁环境、暴露程度和整体系统安全性。鉴于实施健壮的安全系统的困难,并且假设您保护的东西(对其他人)没有高价值,使用您自己的计算机生成随机数可能是可以的。但是,如果对您的系统的威胁很高,您的风险很高,或者您要保护的东西具有很高的价值,那么不,使用计算机生成的随机数是不安全的。

使用计算机上的随机数生成器生成加密密钥是否存在安全风险?

是的,但它可能不是一个足够大的风险来做任何事情。请参阅答案的下一部分。

如果是这样,如何减轻这种风险,特别是在 .Net 中生成 RSA 密钥对时?

在 RSA 加密中,私钥和公钥在数学上是相关的。为了生成私钥-公钥对,需要随机数。如果攻击者拥有用于生成密钥对和公钥的随机数,他们可以轻松找到私钥。

Microsoft 的 .Net 框架为随机数生成提供RNGCryptoServiceProvide 。所有基于软件的随机数生成器实际上都是伪随机数生成器。这意味着它们不是真正随机的,但它们以使输出看起来随机的方式产生输出。

所有软件都是确定性的。这意味着对于给定的一组输入,可以准确地确定输出。这对 prng(伪随机数生成器)不利,因为它们会产生可预测的输出。即输出甚至不会是伪随机的。为了克服这个限制,prng 需要种子随机数据来启动它们。

通过给 prng 函数一些随机数据开始它可以生成大量的伪随机数。产生随机种子数据的方法有很多:使用函数被调用的时间,读取一块未初始化的内存,使用键盘按下之间的时间平均时间,鼠标的位置等。一般用于生成随机数的数据种子也不是完全随机的。

如果攻击者知道用于生成随机数和种子数据的算法,他们可能能够减少 prng 的可能输出,并使用减少的设置输出来轻松找到您的私钥。

我不知道 RNGCryptoServiceProvide 使用什么 rpng 算法,所以我不能说它的有效性。

为了降低随机数生成带来的风险,您可以使用真正的基于硬件的随机数生成器。基于硬件的随机数生成器不需要种子,因为它们使用物理过程而不是算法来生成数据。某些物理过程具有随机或接近随机的特征:放射性粒子的衰减、热曼噪声、晶体管中的竞争条件等。基于硬件的随机数生成器的输出在统计上将比计算机生成的数字更随机。此外,您的计算机上没有可用的值用于生成输出。然而,许多硬件随机数生成器既昂贵又缓慢。

那么,金钱和速度的成本是否值得投资?

这取决于您要保护的内容,以及攻击者的复杂程度和决心。

注意:一些计算机芯片组现在包括硬件随机数生成器。

如果你在伦敦,那么今年你真的应该来参加dc4420.org的每月聚会!关于随机数生成器的三场讲座,我们只是在六月!

其中一个谈话来自 IDQ 和另一位顾问,该顾问研究在线赌场和扑克网站的随机数生成器(真正关心随机性的人)。这是我学到的:

  • 一旦你有一个好的随机性来源,就不要管数据了”我们篡改最少的数据流具有最好的随机性性能
  • “不要散列熵”。如果它使您的熵不再增加,我们将其称为伟哥,而不是哈希函数

当谈到随机数生成器时,没有必要比Quantis 看得更远它相对便宜,而且快速可靠。它来自 IDQ,谁说它被日内瓦政府使用。

其次是基于硬件的机制。如果想从烟雾探测器、网络摄像头和一些蟒蛇(不到 20 英镑)中获得一点乐趣,请查看: http: //www.aperturelabs.com/smoke-rng/

注意:这是一个有趣的 hack,它没有使用经过验证的随机源作为辐射粒子之间的时间,因此可能不是真正的随机(尽管可能比软件更随机)。它应该被视为一个有趣的实验而不是生产用途。

评估随机数生成器的质量:

最糟糕的是基于软件的伪随机数生成器,它使用“随机”的准来源,如 CPU 电流和更糟糕的时间。仅当您正在保护的资产和您面临的威胁对于 Java Dev random 来说是可以的时才使用这些。

我假设您的意思是某些芯片组中可用的硬件 PRNG。

通常,您应该使用操作系统的 PRNG 工具。他们试图产生良好的随机性。我曾经看过一个关于 FreeBSD PRNG 设计的演讲,他们集成了芯片组的硬件 PRNG,这样在最坏的情况下,它不会增加随机性,但也不会削弱系统的 PRNG。但是,我也希望在这个问题上提供更多资源/确认/概括。

请注意,TPM 还提供了 HW PRNG。谷歌可以告诉你如何使用它。“Linux 随机数生成器分析”也可能有一些有趣的提示。

如果您不信任您的 PRNG,可以尝试运行一些 PRNG 测试套件。但是,这些都不能告诉您您的 PRNG 是确实是随机的还是只是伪随机的。

对于这种应用程序(生成相当小的密钥),最大的担忧是 PRNG 可能没有足够的熵播种——如果 PRNG 的输入是可预测的,那么输出也是如此。最近最著名的例子可能是在 OpenSSL 的 Debian 版本中(2006 年 9 月至 2008 年 5 月 13 日之间):它使用的唯一熵源是生成程序的进程 ID,因此只有 32,768 个可能的密钥(以及有些人比其他人更有可能)。(参考:Debian 安全公告 DSA-1571-1在此处讨论。)

这不是一个孤立的事件。 该参考书目在其“在“现实世界”应用程序中使用的 PRNG 中的严重缺陷”部分列出了 4 个示例(并且似乎在十年内没有更新)。另一个例子:Samy Kamkar 展示了如何为 PHP(版本 5.3.2 之前)会话密钥发现足够的熵源以使其具有暴力破解能力

总的来说,我认为最好的方法是使用一个用于密钥生成的随机数生成器(尤其是一个为你处理熵收集的),来自你信任的开发人员。