原文链接,介绍随机数对安全的重要性。如发现错误,请留言或者发送邮件到zwzm85@gmail.com。未经授权,请勿转载。
如果你最近关注关于美国国家安全局和英国政府通信总部技术间谍的新闻,你可能听说过有声明称NSA参与了弱化随机数生成器的活动(译者语:如果你没看到过,并不奇怪。因为这篇文章写于2013年9月13日)。那么问题来了...为什么要弄乱随机数的生成呢?
答案很简单:优良的随机数是几乎所有安全的计算机系统的基础。要是没有它们,从二战的密码(比如Lorenz)到浏览器进行安全网络访问的SSL都会陷入困境。
为了理解背后的原因,和糟糕的随机数导致的危险,需要了解一些随机数自身的知识(比如“那么什么是好的随机数呢?”)和安全系统如何使用它们。
黑客新闻网站被入侵
我用广受欢迎的编程和技术网站黑客新闻被入侵作为随机数如何出错的例子。
四年前,我在网站上提到它的随机数生成器很容易被用来攻击网站。不久以后,另一个完全独立的网站投稿人在获取网站所有者的许可下真正执行了攻击。
这里是其工作原理。当你登陆一个网站,你会被分配一个代表该会话(你登陆的那段时间)的唯一ID。那个唯一ID必须唯一且不能被其他人猜测出来。如果其他人能猜出来,那他就可以冒充你。
在黑客新闻的例子中,唯一ID是一串随机字符类似lBGn0tWMcx7380gZyrUO9B。每个用户都有一个不同的字符串,并且字符串应该非常非常难以猜出或者计算出。
伪随机数
在内部,那些ID使用伪随机数生成器生成。那是一个可以被反复调用以生成表面上随机的数字的数学函数。我之所以说表面上,是因为正如伟大的数学家约翰.冯.诺伊曼所说:“任何想要用算数方法产生随机数字的人都应该是罪恶的”。计算机科学家高德纳曾说过一个故事:他自己发明了一个伪随机数生成器,结果被其糟糕的结果震撼住了。
尽管伪随机数生成器可以生成表面上的随机数序列,但是它们有缺陷。
冯.诺伊曼使用过的一个简单伪随机数生成器被称为平方取中法,工作原理如下。开始你有一个数字(被称为种子),然后计算它的平方。你取中间的四个数作为你的随机数,然后再计算它的平方来获取下一个随机数等等。
比如,你选择4181作为种子,那么将会生成如下的序列4807,1072,1491,2230,9279....:
随机数 | 它的平方 | 中间数字 |
---|---|---|
4181 | 17480761 | 4807 |
4807 | 23107249 | 1072 |
1072 | 1149184 | 1491 |
1491 | 2223081 | 2230 |
2230 | 4972900 | 9729 |
9729 | 94653441 | 6534 |
等等 |
这个伪随机数早已被更好的替代,比如梅森旋转法其输出更加难以预测。平方取中法很容易预测:下一个生成的数字完全取决于上一个生成的数字。梅森旋转法就难预测的多,因为它用内部状态来生成随机数(译者语:外部不可见)。
在密码学中有密码学安全伪随机数生成器,它们被设计成不管你请求生成多少次随机数都不可预测(梅森旋转不是密码学安全的,因为当有足够多的随机数可以观察的时候,它是可预测的)。
对于安全系统来说,随机数生成器不可预测性至关重要。
从种子开始
所有的伪随机数生成器都需要从某个地方开始,它们需要被种下种子,这就是黑客新闻失败的地方。随机数生成器使用黑客新闻网站上次启动时间的毫秒格式作为种子。通过某些仔细的工作,攻击者可以让黑客新闻宕机从而可以预测一分钟长度的重启时间窗口。通过这个时间窗口,攻击者能够预测分配给登录用户的唯一ID,进而可以冒充他们(类似的随机数问题让有些人群可以在在线扑克中作弊)。
黑客新闻被入侵的所有细节都在这里。攻击成功是因为:一旦黑客新闻宕机,攻击者等待它重启然后记录下当前时间。有趣的是,黑客新闻服务器愿意提供这些信息。那么攻击者就有了60秒的可能种子(60000种子,因为种子是毫秒,译者语:60秒等于60000毫秒,也就是60000个种子)。
所以,攻击者登录网站查看自己的唯一ID。它是由黑客新闻服务器生成的随机数。攻击者然后对这60000个种子逐一执行黑客新闻使用的随机数生成算法,直到他发现和自己唯一ID相匹配的ID。那就会告诉他哪个是被使用的种子,他可以通过和黑客新闻一样的随机数序列持续生成后续的唯一ID。从那以后他就可以预测出分配给登录用户的唯一ID,进而可以假冒他们。
黑客新闻的代码改为使用Linux的/dev/urandom源来生成随机数,这意味着现在使用一个优秀的随机数生成器来生成唯一ID,不会再有原来的弱种子。
所以,伪随机数生成会在两方面失败:种子可能是糟糕的,或者算法本身可以被预测。
无处不在的随机数
黑客新闻的例子并不涉及到密码学,但是随机数对密码技术至关重要。比如,任何HTTPS会话都会以如下方式开始:
- 浏览器发送信息给服务器,告知其想要使用的SSL版本和其他信息。
- 服务器回复类似的SSL版本信息和SSL证书(译者语:关于证书的更多知识请看这里)。
- 浏览器校验证书是否合法。如果合法,它会生成一个随机的'pre-master密钥',其会被用来保证连接的安全。
后续的交换信息都依赖于随机选取的pre-master密钥。为了保证连接的安全性,它不能被预测。
以下是计算机如何使用WPA2协议与接入点建立安全的无线连接的过程的一部分:
- 接入点生成一个随机nonce,然后把它发送给计算机。
- 计算机生成一个随机nonce,然后发送给接入点。
接入点和计算机从此以后会持续使用这些随机nonce来保证连接的安全。
同样,随机数会出现在以下场景:当用户登录网站(和其他系统),使用SSH创建安全连接,进行Skype(译者语:微软开发的一款通信软件)视频聊天,发送加密邮件还有很多。
唯一完全安全的密码系统--一次性密码本的致命缺点就是密码本必须完全随机地生成。使用的随机数有任何可被预测性或非均匀性都会导致一次性密码本会被破解(一次性密码本的另一个问题是复用:它们必须只被使用一次)。
CloudFlare的随机数源
在CloudFlare,我们需要大量随机数来加密:我们需要它们来建立安全的SSL连接、Railgun(译者语:CloudFlare的一个动态内容缓存服务)、生成密钥对、和身份验证系统。它们也是我们向客户推出的向前安全性的重要组成部分。
我们目前基本上通过OpenSSL的随机数生成系统或者Linux内核获取随机数。两者都会从不同源向随机数生成器种入种子,使它们尽可能不能被预测。这些源包括网络数据或者磁盘的寻道时间。但是我们认为我们可以通过增加一些真正随机的数据来优化它们。结果就是提升我们客户的安全性。
我们已经启动一个项目,通过提供不是来源于数学计算的真正随机数源来进一步优化我们的随机数。可以借助类似放射性衰变,流体运动,大气噪声,和其他混乱来实现。
当新系统在线运行了,我们会发布它的详细信息。