@ 2014.02.23 , 23:08
45

电脑随机数是如何生成的?

[-]

不论是维持着你余额宝安全的加密过程还是你在玩《战地4》,电脑都会产生随机数。目前有两类随机数——“真”随机数和伪随机数——两者的区别关乎加密系统的安全度。

对于随机数的讨论日渐升温,许多人怀疑英特尔内置于各种硬件内的随机数生成芯片是不是靠得住。要理解为什么这种随机数不太可靠,你必须理解随机数的生成原理。

随机数的作用

随机数的使用历史已经有数千年。无论是抛硬币还是摇色子,目的是让随机概率决定结果。电脑中的随机数生成器的目的也是如此——生成随机不可预测的结果。

加密法要求数字不能被攻击者猜到,不能多次使用同样的数字。所以需要一种机制产生攻击者无法预测的数字,这些随机数对加密法至关重要,无论你是加密文件还是访问https协议网站,都需要用到随机数。

[-]

真随机数

如果电脑是靠代码生成随机数,是不是意味着随机数可以被预测?

根据随机数的生成原理,我们把电脑随机数分为两类:“真”随机数和伪随机数。

要生成一个“真”随机数,电脑会检测电脑外部发生的某种物理现象。比如说,电脑可以测量某个原子的放射性衰变。根据量子理论,原子衰变是随机而不可测的,所以这就是宇宙中的“纯粹”随机性。攻击者永远无法预测原子衰变的发生时间,也就不可能猜出随机值。

举个更实际的例子,电脑会根据环境中的噪音或者采取你敲击键盘的精确时间作为随机数据或熵的生成依据。举个例子,你的电脑监测到你某天下午2点以后敲击键盘的精确时间是0.23423523秒,有足够的这些特定长数字你就能得到一个熵源,也就可以生成“真”随机数。由于人不是机器,所以攻击者无法掌握你的敲击时间。Linux中的/dev/随机设备生成随机数,“阻拦”访问直到熵积累量足够才返回一个真随机数。

[-]

伪随机数

伪随机数这个概念是相对于“真”随机数而言。电脑通过发送种子数值,运用算法产生某个看起来像随机数的数字,但是实际上这个数字是可以预测的。因为电脑没有从环境中收集到任何随机信息。

虽然是伪随机数,但是并不是所有领域都不需要伪随机数。比如,如果你在玩电子游戏,那么游戏过程中是靠伪随机数还是真随机数并不重要。另一方面,如果你的应用正在加密,情况就不同了,因为你不希望攻击者能够猜到你的随机数。

举个例子,如果攻击者掌握了某随机数生成器使用的种子数值和加密算法,如果随机数生成器完全依靠种子数值和加密算法生成密文,这个过程中不添加任何额外随机性,如果攻击者掌握的情报足够多,他们可以逆推来确定加密算法一定会用到的伪随机数,也就能破译密文。

[-]

NSA和Intel的硬件随机数生成器

为了帮助程序开发者更简单的生成随机数,也为了帮助生成安全的随机数,Intel的芯片组中包括一个硬件随机数生成器,名叫RdRand,这块芯片利用处理器的熵源向软件提供随机数。

问题是这个随机数生成器是个黑盒,我们不清楚里面的工作原理。如果RdRand藏有NSA的后门,那么政府就可以破译依靠随机数生成器提供的唯一数据产生的密钥。

这个问题非常严重。在2013年12月,FreeBSD的开发者们取消了对直接采用RdRand作为随机数源的支持,理由是无法信任Intel。RdRand设备的输出结果会用另一套加密算法增加额外熵,确保随机数服务器中即便有后门程序也不会产生影响。Linux已经这么做了,在RdRand的随机数基础上再次进行随机处理,以确保后门程序不可能从中作祟。Intel总裁Brian Krzanich在Reddit上没有直接回答关于是否装有后门的问题。

当然这不是Intel一家的问题,FreeBSD的开发者们也点了Via芯片的名。从这场争论中我们可以看出为什么不可预测的真随机数如此重要。

[-]

而随机数生成器生成“真”随机数只需要搜集熵或者从真实世界搜集看似随机的数据。对于某些不需要真正随机的应用,随机生成器可能会通过算法和种子数值算出随机数。

本文译自 Howtogeek,由译者 王大发财 基于创作共用协议(BY-NC)发布。


给这篇稿打赏,让译者更有动力
支付宝打赏 [x]
您的大名: 打赏金额:

4.5
赞一个 (77)

TOTAL COMMENTS: 45+1

  1. 赌徒红桃Q
    @4 years ago
    2334676

    难道不是我的四核CPU四人一桌摇色子玩,玩出来的吗?

    [153] XX [14] 回复 [0]
  2. 赌徒红桃Q
    @4 years ago
    2334680

    还是说他们玩的是21点

  3. 叫姐姐姐姐
    @4 years ago
    2334683

    虽然全是中文 但是全都没看懂

    [25] XX [25] 回复 [0]
  4. 赌徒红桃Q
    @4 years ago
    2334685

    说起来在有赌博迷你游戏的电子游戏里我手气一直不好,输个不停

  5. 2334689

    那RdRand这块芯片如何利用处理器的熵源向软件提供随机数?

  6. 赌徒红桃Q
    @4 years ago
    2334691

    尼玛在游戏里赢1000美金的服装解锁条件太变态了,没赢到100美金,就先输光了

  7. 惩戒
    @4 years ago
    2334692

    大多都是伪随机数吧,计算机想制造真随机数必须先采集一个外界的随机信息

    [62] XX [7] 回复 [0]
  8. 赌徒红桃Q
    @4 years ago
    2334695

    就不能简单一些吗

  9. 2334701

    真随机数就在一个加密软件里见到过,要求你随机移动鼠标,收集随机数据来生成密钥

    [55] XX [8] 回复 [0]
  10. wee——haha
    @4 years ago
    2334702

    怎么最近煎蛋老上不了???尤其手机

  11. 异性世界
    @4 years ago
    2334710

    伪随机数的一种生成方法是,利用当前程序的代码运行的系统时间的毫秒甚至微秒的值计算产生,它的依据是同一个代码片段每次在cpu时间轮回里的运行时间会在微秒级有一定差别。

    [13] XX [1] 回复 [0]
  12. Rapture
    @4 years ago
    2334715

    一般人最想知道的是伪随机算法吧……这文章讲了也等于没讲

  13. 巴普
    @4 years ago
    2334720

    我记得是看过说计算机只能出0至1之间的小数,然后再处理,骰子只有1到6,弄个乘6什么再舍小数?不记得了

    [4] XX [10] 回复 [0]
  14. guozichi
    @4 years ago
    2334727

    举个例子,你的电脑监测到你某天下午2点以后敲击键盘的精确时间是零点二三四二三五二三秒
    ———————————————————————
    24*3600*10^8 以现有计算机的速度 这不算什么吧
    科技大跃进之前,量子随机有可能是现科技水平下产生真随机的唯一途径

    [5] XX [10] 回复 [0]
  15. 小甜甜
    @4 years ago
    2334741

    我会告诉你我用随机数预测和正态分布中了双色球奖么

    [7] XX [26] 回复 [0]
  16. 午饭
    @4 years ago
    2334742

    我发现最近用手机上时,UC打开云端加速就打不开煎蛋,关闭后就能打开

  17. 2334748

    所以早就和你说C++老师都是骗人的哈哈哈哈哈

    [2] XX [11] 回复 [0]
  18. 2334750

    @: 是说putty的puttygen么。。。

  19. 师头
    @4 years ago
    2334761

    @guozichi: 这个熵源只是种子,用来作为随机数生成函数的种子,生成随机数的算法还是固定的。如果随机数生成算法非常复杂,那么计算量也就完全不是一个等级了

  20. 2334769

    mega加密貌似也用真随机数

  21. Shuffle
    @4 years ago
    2334827

    说到伪随机数首先想到的就是随机播放= =

  22. Ctckly
    @4 years ago
    2334835

    早期的游戏生成随机数的方式就是按顺序生成长长一列……如果你某个时刻把游戏连程序带数据拷贝下来,只要你接下来的操作不变,所谓的“随机”结果就变成固定的了……

  23. 哲学大叔
    @4 years ago
    2334858

    验证随机性就是个大问题。

  24. seralpha
    @4 years ago
    2334882

    芯片里一般是利用电路噪声产生真随机数的。。。这玩意儿在集成电路里实现很容易,目前大部分产品里都使用了吧。。。

  25. 断不了的根
    @4 years ago
    2334899

    怪不得我每次玩麻将游戏都摸一手臭得无法再臭的牌,通常打到最后一张再返过头来看,除了七对子以外,其他牌型都胡不了。原来是因为我敲击鼠标的精确时间决定了随机数的分配啊。这一定就是传闻噩运即使在游戏中也依旧缠身的原因(?(?)?)

  26. DeepNight
    @4 years ago
    2334932

    我原来在一个赌博设备生产商工作。我们公司也不是直接用硬件的随机数,而是像文中说的对硬件随机数的结果再次随机。
    更高端的是:我们有的解决方案中是有个一叫做随机数生成器的大服务器来给赌场里的设备提供随机数。

    [19] XX [8] 回复 [0]
  27. 2334961

    游戏一般不会采用真随机数,否则游戏难度不好控制

  28. RedNax
    @4 years ago
    2334992

    @zmn: 游戏不用真随机数的原因单纯只是没必要啦……

  29. 2334995

    A: 来看我们的随机数生成器吧

    生成器:9, 9, 9, 9, 9, 9, 9, …

    B: 你确定那是随机数生成器吗?

    A: 随机就是这样,你永远不能确定。

    [32] XX [5] 回复 [0]
  30. 玖城
    @4 years ago
    2335126

    有人能讲解一下我输入密码被附加上随机数之后,服务器如何验证密码正确与否呢?一直很想了解

  31. 评论区梦魇
    @4 years ago
    2335153

    编程的话都是把系统时间设为种子……

  32. Oliver
    @4 years ago
    2335162

    大部分没有用户参与的随机数生成都是伪随机数,靠硬件信息时间信息这些东西都很容易重现随机数。
    @玖城 你的话我不知道理解对不对,随机数一般是用来加密密码的,和服务器验证没关系。 如果随机数是可预测的,别人拿到随机数,就很容易暴力破解你的密码(密码字典+随机数 生成 加密密码),如果没有随机数,暴力破解就很困难

  33. 玖城
    @4 years ago
    2335178

    @Oliver: 那登陆时候输入的密码还是我自己知道的那个密码而不是一串字符,网络传输过程还是传输的明文么?随机数到底用在了具体哪个地方啊……

  34. RedNax
    @4 years ago
    2335202

    @评论区梦魇: 这非常危险,如果是邮件这类的话时间很容易从邮件发送时间穷举出来。

  35. 2335278

    @玖城: @玖城: 一般不是附上一个随机数,而是根据你的密码作为种子生成的一个伪随机值(加盐)。比如你的密码时123456,在你登录的时会附上一个有123456计算出来的值,比如abcde。然后对整个字符串计算md5值(或者更安全的bcrypt),把这个值传给服务器。服务器记录的你的校验信息也是用同样方法计算得出的值,在验证你的信息是只需要比较2个值是不是一样就行。一般服务器是不会记录密码的明文的。

    以上说的都是密码校验比较通用的实现方式,天朝大部分网站直接传的就是明文

  36. 2335315

    @nau:
    天朝大部分网站存的密码是明文,因为这样他们在大难当头时随时出卖你~

    [12] XX [5] 回复 [0]
  37. unistar
    @4 years ago
    2335336

    小学时候玩QBasic,写了个彩票选号程序,每次算出来的随机数都是一样的。后来这个数字被我用做了密码。

    [12] XX [2] 回复 [0]
  38. 2335338

    @RnMss: 是的。有些网站很有意思的,登录部分用https,但是密码传的的是明文。只能认为是为方便查水表

  39. 玖城
    @4 years ago
    2335476

    @nau: 如果两头都是根据一个种子新计算一遍,那么用所谓的真随机加密不就是不可实现的么?如果真是一个随机数而不是公式,那么完全没法验证吧?

  40. 2335732

    不知所谓!

  41. 2335911

    @玖城: 是的,所以真随机没法让第二个人验证。

  42. minion
    @4 years ago
    2335940

    原来这么麻烦,电脑原来最怕的不是一堆看起来好复杂的计算,他们最怕的原来是:随便。。。

  43. 走过
    @4 years ago
    2343792

    @小甜甜: 逗比,双色球会满足正态分布?所以认为干预时间是不可能满足正态分布的。除非双色球真是摇出来的,你信么??

  44. 额我不知道
    @2 years ago
    2937698

    这个世界有随机的东西么?所有事情都发生在历史之上,你为何在此刻微笑?树叶为何往那飘?看似不确定,只是没有人或机器能够统筹所有因素。以上个人之见,不服来辩。

发表评论


24H最赞