云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

网站空间_cdn免流_企业级

小七 141 0

生产中的拉瓦兰:本质的技术细节

云彩大厅的熔岩灯。由@mahtin提供介绍你们中的一些人可能知道,在我们旧金山办公室的大厅里有一堵熔岩灯墙,我们用它来做密码。在这篇文章中,我们将详细探讨它是如何工作的。这篇文章假定有技术背景。对于不需要技术背景的更高层次的讨论,请参见随机性101:LavaRand in Production。背景正如我们在过去讨论过的,密码学依赖于生成随机数的能力,这些随机数既不可预测,又对任何对手保密。在这篇文章中,我们将深入研究技术细节,因此我们需要一些背景知识来确保每个人都在同一个页面上。真随机与伪随机在密码学中,术语随机意味着不可预测。也就是说,如果攻击者无法以超过50%的准确率预测下一个位(换句话说,不比随机概率好),那么生成随机位的过程是安全的。我们可以使用两种方法之一获得不可预测的随机性。第一种产生真正的随机性,而第二种产生伪随机性。真正的随机性是通过测量一个物理过程而获得的任何信息。它的不可预测性取决于被测物理过程的固有不可预测性(如放射性衰变的不可预测性),或精确物理测量固有的不精确性(例如。,某些物理测量的最低有效数字的不精确性,例如CPU温度的测量或键盘上按键的时间)。以这种方式获得的随机值即使对测量它们的人也是不可预测的(执行测量的人在执行测量之前无法预测值是什么),因此对于外部攻击者来说也是不可预测的。密码算法中使用的所有随机性都是从物理测量中获得的真实随机性开始的。然而,获得真正的随机值通常是昂贵和缓慢的,因此直接在密码算法中使用它们是不切实际的。相反,我们使用伪随机性。伪随机性是通过使用一种确定性算法来生成的,该算法将其他一些称为种子的随机值作为输入,并产生大量的随机输出(这些算法称为加密安全伪随机数生成器,或CSPRNGs)。CSPRNG有两个关键属性:首先,如果攻击者无法预测seed的值,那么该攻击者也同样无法预测CSPRNG的输出(即使向攻击者显示的输出达到某一点,比如前10位-输出的其余部分-位11、12,等等-仍然是完全不可预测的)。第二,由于该算法是确定性的,使用相同的种子作为输入运行两次该算法将产生相同的输出。现代密码学中使用的CSPRNGs不仅速度非常快,而且能够在相对较小的种子(大约几百位的数量级)的情况下安全地产生无限量的输出。因此,为了有效地产生大量的安全随机性,真正的随机性是从某些物理过程中获得的(这是缓慢的),并输入到CSPRNG中,而CSPRNG又产生了应用程序所需的随机性(这是快速的)。通过这种方式,可以获得既安全又便宜的随机性(因为它来自攻击者无法预测的真正的随机源),因为CSPRNG被用来将真正随机的种子变成更大的伪随机输出流。失去随机性一个常见的误解是,CSPRNG如果使用足够长的时间,可能会"耗尽"随机性。这是一个可以理解的信念,因为正如我们将在下一节中讨论的那样,操作系统通常会用新的随机性重新播种它们的CSPRNGs,以防止攻击者发现内部状态、损坏的CSPRNGs和其他缺陷。但是,如果一个算法在技术上是一个真正的CSPRNG,那么它失去随机性的唯一方法就是有人从中消耗远远超过实际消耗的值(想想在几千年或更长的时间内尽可能快地从CSPRNG中消耗值)然而,我们在实践中使用的快速CSPRNGs都没有被证明是真正的CSPRNGs。他们只是坚信它们是真正的CSPRNGs,或是与之相近的东西。它们经受住了学术分析的考验,在生产中使用多年,受到了资源丰富的对手的攻击,等等。但这并不意味着他们没有缺点。例如,SHA-1,长期被认为是一个密码安全的抗冲突哈希函数(一个可用于构造CSPRNG的构建块)最终被发现是不安全的。今天,它可以被打破价值11万美元的云计算资源因此,即使我们不担心在一个真正的CSPRNG中没有随机性,我们也不确定我们实际使用的是真正的CSPRNG。因此,为了避免攻击者已经发现如何破解我们的CSPRNGs的可能性,密码系统的设计者通常选择用新获得的真实随机性重新种子CSPRNGs,以防万一。操作系统中的随机性在大多数计算机系统中,操作系统的职责之一是提供密码安全的伪随机性,以用于各种安全应用程序。由于操作系统无法提前知道哪些应用程序需要伪随机性(或者它们需要多少伪随机性),大多数系统只需保留一个熵池4(一组被认为是安全的随机性集合),用于为随机性请求提供服务的CSPRNG(例如,Linux上的/dev/urandom)。然后,系统不仅要在系统第一次启动时为这个熵池播种,同时,还需要定期更新池(并重新设定csprnng)的随机性,从系统可用的任何真实随机性源,以防止损坏的CSPRNGs或攻击者通过其他非加密攻击破坏熵池。为了简洁起见,由于Cloudflare的生产系统运行Linux,我们将把系统的伪随机性提供者简单地称为/dev/urandom,不过请注意,本讨论中的所有内容对于其他操作系统也是如此。考虑到熵池和CSPRNG的这种设置,有几种情况可能会危及/dev/urandom的安全性:真正随机性的来源熵池的可预测性太强,使得攻击者能够猜测从这些源获得的值,从而预测/dev/urandom的输出。攻击者可以访问真正随机性的来源,从而能够观察它们的值,从而预测/dev/urandom的输出。攻击者可以修改真正随机性的来源,从而能够影响从这些来源获得的值,从而预测/dev/urandom的输出。随机混合解决这些安全问题的一个常见方法是在系统的熵池中混合多个随机源,其思想是只要其中一些源保持不妥协,系统就仍然是安全的。例如,当查询随机输出时,如果源X、Y和Z提供值X、Y和Z,我们可以用H(X,Y,Z)作为熵池的种子,其中H是加密安全的抗冲突哈希函数。即使我们假设其中两个源——比如说X和Y——是恶意的,只要控制它们的攻击者无法观察到Z的输出,5那么无论它们产生什么样的X和Y值,H(X,Y,Z)对他们来说仍然是不可预测的。拉瓦兰从摄像机看到的景象虽然有人能够预测或修改我们生产机器上熵源的输出的概率很低,但我们假装这是不可能的,这是不负责任的。类似地,虽然针对最先进的CSPRNGs的加密攻击很少见,但它们偶尔也会发生。重要的是我们要通过增加额外的防御层来避免这些可能性。这就是拉瓦朗的用武之地。简而言之,拉瓦兰是一个为我们的生产机器提供额外的熵源的系统。在我们旧金山办公室的大厅里,我们有一堵熔岩灯墙(如上图所示)。这面墙的一个视频输入被用来产生熵,并提供给我们的生产车队。我们不是第一个这么做的。我们的LavaRand系统的灵感来自于Silicon Graphics首次提出并制造的类似系统,并于1996年获得专利(专利已过期)。熔岩灯中"熔岩"的流动是非常不可预测的,因此这些灯中的熵非常高。即使我们保守地假设相机的分辨率为100x100像素(当然,它实际上要高得多),而且攻击者可以在一位精度内猜测该图像中任何像素的值(例如,他们知道某个特定像素的红色值为123或124,但他们不确定是哪个),图像产生的总熵为100x100x3=30000位(x3是因为每个像素包含三个值-红色、绿色和蓝色通道)。这比我们需要的熵多了一个数量级。设计拉瓦兰的熵流拉瓦兰德系统的整体设计如上图所示。熵流可以分解为以下步骤:办公室大厅的熔岩灯墙提供了一个真正的熵源。在大厅里,一架摄像机正对着墙上。它从熔岩灯的视觉输入和单个光感受器的随机噪声中获得熵。在办公室里,有一台服务器与摄像机相连。服务器有自己的熵系统,该熵系统的输出与来自