加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

关于/dev/urandom 的流言终结

发布时间:2019-05-07 23:20:17 所属栏目:Windows 来源:Thomas Hühn
导读:副标题#e# 有很多关于 /dev/urandom 和 /dev/random 的流言在坊间不断流传。然而流言终究是流言。 本篇文章里针对的都是近来的 Linux 操作系统,其它类 Unix 操作系统不在讨论范围内。 /dev/urandom 不安全。加密用途必须使用 /dev/random 事实 : /dev/ura
副标题[/!--empirenews.page--]

关于/dev/urandom 的流言终结

有很多关于 /dev/urandom/dev/random 的流言在坊间不断流传。然而流言终究是流言。

本篇文章里针对的都是近来的 Linux 操作系统,其它类 Unix 操作系统不在讨论范围内。

/dev/urandom 不安全。加密用途必须使用 /dev/random

事实/dev/urandom 才是类 Unix 操作系统下推荐的加密种子。

/dev/urandom伪随机数生成器pseudo random number generator(PRND),而 /dev/random 是“真”随机数生成器。

事实:它们两者本质上用的是同一种 CSPRNG (一种密码学伪随机数生成器)。它们之间细微的差别和“真”“不真”随机完全无关。(参见:“Linux 随机数生成器的构架”一节)

/dev/random 在任何情况下都是密码学应用更好地选择。即便 /dev/urandom 也同样安全,我们还是不应该用它。

事实/dev/random 有个很恶心人的问题:它是阻塞的。(参见:“阻塞有什么问题?”一节)(LCTT 译注:意味着请求都得逐个执行,等待前一个请求完成)

但阻塞不是好事吗!/dev/random 只会给出电脑收集的信息熵足以支持的随机量。/dev/urandom 在用完了所有熵的情况下还会不断吐出不安全的随机数给你。

事实:这是误解。就算我们不去考虑应用层面后续对随机种子的用法,“用完信息熵池”这个概念本身就不存在。仅仅 256 位的熵就足以生成计算上安全的随机数很长、很长的一段时间了。(参见:“那熵池快空了的情况呢?”一节)

问题的关键还在后头:/dev/random 怎么知道有系统会多少可用的信息熵?接着看!

但密码学家老是讨论重新选种子(re-seeding)。这难道不和上一条冲突吗?

事实:你说的也没错!某种程度上吧。确实,随机数生成器一直在使用系统信息熵的状态重新选种。但这么做(一部分)是因为别的原因。(参见:“重新选种”一节)

这样说吧,我没有说引入新的信息熵是坏的。更多的熵肯定更好。我只是说在熵池低的时候阻塞是没必要的。

好,就算你说的都对,但是 /dev/(u)random 的 man 页面和你说的也不一样啊!到底有没有专家同意你说的这堆啊?

事实:其实 man 页面和我说的不冲突。它看似好像在说 /dev/urandom 对密码学用途来说不安全,但如果你真的理解这堆密码学术语你就知道它说的并不是这个意思。(参见:“random 和 urandom 的 man 页面”一节)

man 页面确实说在一些情况下推荐使用 /dev/random (我觉得也没问题,但绝对不是说必要的),但它也推荐在大多数“一般”的密码学应用下使用 /dev/urandom

虽然诉诸权威一般来说不是好事,但在密码学这么严肃的事情上,和专家统一意见是很有必要的。

所以说呢,还确实有一些专家和我的一件事一致的:/dev/urandom 就应该是类 UNIX 操作系统下密码学应用的首选。显然的,是他们的观点说服了我而不是反过来的。(参见:“正道”一节)


难以相信吗?觉得我肯定错了?读下去看我能不能说服你。

我尝试不讲太高深的东西,但是有两点内容必须先提一下才能让我们接着论证观点。

首当其冲的,什么是随机性,或者更准确地:我们在探讨什么样的随机性?(参见:“真随机”一节)

另外一点很重要的是,我没有尝试以说教的态度对你们写这段话。我写这篇文章是为了日后可以在讨论起的时候指给别人看。比 140 字长(LCTT 译注:推特长度)。这样我就不用一遍遍重复我的观点了。能把论点磨炼成一篇文章本身就很有助于将来的讨论。(参见:“你是在说我笨?!”一节)

并且我非常乐意听到不一样的观点。但我只是认为单单地说 /dev/urandom 坏是不够的。你得能指出到底有什么问题,并且剖析它们。

你是在说我笨?!

绝对没有!

事实上我自己也相信了 “/dev/urandom 是不安全的” 好些年。这几乎不是我们的错,因为那么德高望重的人在 Usenet、论坛、推特上跟我们重复这个观点。甚至连 man 手册都似是而非地说着。我们当年怎么可能鄙视诸如“信息熵太低了”这种看上去就很让人信服的观点呢?(参见:“random 和 urandom 的 man 页面”一节)

整个流言之所以如此广为流传不是因为人们太蠢,而是因为但凡有点关于信息熵和密码学概念的人都会觉得这个说法很有道理。直觉似乎都在告诉我们这流言讲的很有道理。很不幸直觉在密码学里通常不管用,这次也一样。

真随机

随机数是“真正随机”是什么意思?

我不想搞的太复杂以至于变成哲学范畴的东西。这种讨论很容易走偏因为对于随机模型大家见仁见智,讨论很快变得毫无意义。

在我看来“真随机”的“试金石”是量子效应。一个光子穿过或不穿过一个半透镜。或者观察一个放射性粒子衰变。这类东西是现实世界最接近真随机的东西。当然,有些人也不相信这类过程是真随机的,或者这个世界根本不存在任何随机性。这个就百家争鸣了,我也不好多说什么了。

密码学家一般都会通过不去讨论什么是“真随机”来避免这种哲学辩论。他们更关心的是不可预测性unpredictability。只要没有任何方法能猜出下一个随机数就可以了。所以当你以密码学应用为前提讨论一个随机数好不好的时候,在我看来这才是最重要的。

无论如何,我不怎么关心“哲学上安全”的随机数,这也包括别人嘴里的“真”随机数。

两种安全,一种有用

但就让我们退一步说,你有了一个“真”随机变量。你下一步做什么呢?

你把它们打印出来然后挂在墙上来展示量子宇宙的美与和谐?牛逼!我支持你。

但是等等,你说你要它们?做密码学用途?额,那这就废了,因为这事情就有点复杂了。

事情是这样的,你的真随机、量子力学加护的随机数即将被用进不理想的现实世界算法里去。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读