蚊章汇 - 随机
type: channel
link: https://linuxcn.bwsl.wang/tag/%E9%9A%8F%E6%9C%BA/
items: 关于 /dev/urandom 的流言终结
items: 给初学者看的 shuf 命令教程
items: 使用 Elizabeth 为应用生成随机样本数据

关于 /dev/urandom 的流言终结
type: item
date: 2019-05-05T19:49:00+08:00
description: 有很多关于 /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 页面”一节）整个流言之所以如此广为流传不是因为人们太蠢，而是因为但凡有点关于信息熵和密码学概念的人都会觉得这个说法很有道理。直觉似乎都在告诉我们这流言讲的很有道理。很不幸直觉在密码学里通常不管用，这次也一样。真随机随机数是“真正随机”是什么意思？我不想搞的太复杂以至于变成哲学范畴的东西。这种讨论很容易走偏因为对于随机模型大家见仁见智，讨论很快变得毫无意义。在我看来“真随机”的“试金石”是量子效应。一个光子穿过或不穿过一个半透镜。或者观察一个放射性粒…

给初学者看的 shuf 命令教程
type: item
date: 2018-05-13T15:48:38+08:00
description: shuf 命令用于在类 Unix 操作系统中生成随机排列。使用 shuf 命令，我们可以随机打乱给定输入文件的行。shuf 命令是 GNU Coreutils 的一部分，因此你不必担心安装问题。在这个简短的教程中，让我向你展示一些 shuf 命令的例子。带例子的 shuf 命令教程我有一个名为 ostechnix.txt 的文件，内容如下：$ cat ostechnix.txt line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 现在让我们以随机顺序显示上面的行。为此，请运行：$ shuf ostechnix.txt line2 line8 line5 line10 line7 line1 line4 line6 line9 line3 看到了吗？上面的命令将名为 ostechnix.txt 中的行随机排列并输出了结果。你可能想将输出写入另一个文件。例如，我想将输出保存到 output.txt 中。为此，请先创建 output.txt：$ touch output.txt 然后，像下面使用 -o 标志将输出写入该文件：$ shuf ostechnix.txt -o output.txt 上面的命令将随机随机打乱 ostechnix.txt 的内容并将输出写入 output.txt。你可以使用命令查看 output.txt 的内容：$ cat output.txt line2 line8 line9 line10 line1 line3 line7 line6 line4 line5 我只想显示文件中的任意一行。我该怎么做？很简单！$ shuf -n 1 ostechnix.txt line6 同样，我们可以选择前 “n” 个随机条目。以下命令将只显示前五个随机条目：$ shuf -n 5 ostechnix.txt line10 line4 line5 line9 line3 如下所示，我们可以直接使用 -e 标志传入输入，而不是从文件中读取行：$ shuf -e line1 line2 line3 line4 line5 line1 line3 line5 line4 line2 你也可以传入数字：$ shuf -e 1 2 3 4 5 3 5 1 4 2 要快速在给定范围选择一个，请改用此命令：$ shuf -n 1 -e 1 2 3 4 5 或者，选择下面的任意三个随机数字：$ shuf -n 3 -e 1 2 3 4 5 3 5 1 我们也可以在特定范围内生成随机数。例如，要显示 1 到 10 之间的随机数，只需使用：$ shuf -i 1-10 1 9 8 2 4 7 6 3 10 5 有关更多详细信息，请参阅手册页。$ man shuf 今天就是这些。还有更多更好的东西。敬请关注！干杯!via: https://www.ostechnix.com/the-shuf-command-tutorial-with-examples-for-beginners/作者：SK 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

使用 Elizabeth 为应用生成随机样本数据
type: item
date: 2017-03-06T17:30:00+08:00
description: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.不，我的文章没有被 Lorem ipsum 生成器劫持（LCTT 译注：Lorem ipsum，中文又称“乱数假文”，只是一段用来测试排版效果的占位文字，没有实际的含义）。作为本月的 Nooks＆Crannies 专栏文章，我发现了一个有趣的小 Python 库，以帮助开发人员为其应用程序生成随机数据。它被称为 Elizabeth。它由 Líkið Geimfari 编写，并在 MIT 许可证下发行，Elizabeth 以 21 个不同本地化信息提供了 18 种数据提供器，可用于生成随机信息（LCTT 译注：不仅是随机数），包括姓名和个人特征、地址、文本数据、交通信息、网络和 Internet 社交媒体数据、数字等等。安装它需要 Python 3.2 或更高版本，您可以使用 pip 或从 git 仓库安装它。在我的测试机上，我在一个全新安装的 Debian Jessie 上使用 pip 来安装它，要做的就是 apt-get install python3-pip，它将安装 Python 和所需的依赖项。然后 pip install elizabeth，之后就安装好了。只是为好玩，让我们在 Python 的交互式解释器中为一个人生成一些随机数据：>>> from elizabeth import Personal >>> p=Personal('en') >>> p.full_name(gender="male") 'Elvis Herring' >>> p.blood_type() 'B+' >>> p.credit_card_expiration_date() '09/17' >>> p.email(gender='male') 'jessie7517@gmail.com' >>> p.favorite_music_genre() 'Ambient' >>> p.identifier(mask='13064########') '1306420450944' >>> p.sexual_orientation() 'Heterosexual' >>> p.work_experience() 39 >>> p.occupation() 'Senior System Designer' >>> 在代码中使用它就像创建一个对象那样，然后调用要你需要填充数据的对应方法。Elizabeth 内置了 18 种不同的生成工具，添加新的生成器并不困难；你只需要定义从 JSON 值集合中获取数据的例程。以下是一些随机文本字符串生成，再次打开解释器：>>> from elizabeth import Text >>> t=Text('en') >>> t.swear_word() 'Rat-fink' >>> t.quote() 'Let them eat cake.' >>> t.words(quantity=20) ['securities', 'keeps', 'accessibility', 'barbara', 'represent', 'hentai', 'flower', 'keys', 'rpm', 'queen', 'kingdom', 'posted', 'wearing', 'attend', 'stack', 'interface', 'quite', 'elementary', 'broadcast', 'holland'] >>> t.sentence() 'She spent her earliest years reading classic literature, and writing poetry.' 使用 Elizabeth 填充 SQLite 或其它你可能需要用于开发或测试的数据库并不困难。其介绍文档给出了使用 Flask 这个轻量级 web 框架的一个医疗应用程序示例。我对 Elizabeth …