标签 随机数 下的文章

Go 的随机数生成器是生成难以猜测的密码的好方法。

你可以使用 Go 编程语言 提供的随机数生成器来生成由 ASCII 字符组成的难以猜测的密码。尽管本文中提供的代码很容易阅读,但是你仍需要了解 Go 的基础知识,才能更好地理解它。如果你是对 Go 还不熟悉,请阅读 Go 语言之旅 来了解更多信息,然后返回此处。

在介绍实用程序和它的代码之前,让我们先来看看这个 ASCII 表的子集,它可以在 man ascii 命令的输出中找到:

30 40 50 60 70 80 90 100 110 120
 ---------------------------------
0:    (  2  <  F  P  Z  d   n   x
1:    )  3  =  G  Q  [  e   o   y
2:    *  4  >  H  R  \  f   p   z
3: !  +  5  ?  I  S  ]  g   q   {
4: "  ,  6  @  J  T  ^  h   r   |
5: #  -  7  A  K  U  _  i   s   }
6: $  .  8  B  L  V  `  j   t   ~
7: %  /  9  C  M  W  a  k   u  DEL
8: &  0  :  D  N  X  b  l   v
9: '  1  ;  E  O  Y  c  m   w

在所有 ASCII 字符中,可打印字符的十进制值范围为 33 到 126,其他的 ASCII 值都不适合用于密码。因此,本文介绍的实用程序将生成该范围内的 ASCII 字符。

生成随机整数

第一个实用程序名为 random.go,它生成指定数量的随机整数,这些整数位于给定范围内。random.go 最重要的部分是这个函数:

func random(min, max int) int {
    return rand.Intn(max-min) + min
}

此函数使用了 rand.Intn() 函数来生成一个属于给定范围的随机整数。请注意,rand.Intn() 返回一个属于 [0,n) 的非负随机整数。如果它的参数是一个负数,这个函数将会抛出异常,异常消息是:panic: invalid argument to Intn。你可以在 math/rand 文档 中找到 math/rand 包的使用说明。

random.go 实用程序接受三个命令行参数:生成的整数的最小值、最大值和个数。

编译和执行 random.go 会产生这样的输出:

$ go build random.go
$ ./random
Usage: ./random MIX MAX TOTAL
$ ./random 1 3 10
2 2 1 2 2 1 1 2 2 1

如果你希望在 Go 中生成更安全的随机数,请使用 Go 库中的 crypto/rand 包。

生成随机密码

第二个实用程序 randomPass.go 用于生成随机密码。randomPass.go 使用 random() 函数来生成随机整数,它们随后被以下 Go 代码转换为 ASCII 字符:

for {
    myRand := random(MIN, MAX)
    newChar := string(startChar[0] + byte(myRand))
    fmt.Print(newChar)
    if i == LENGTH {
        break
    }
    i++
}

MIN 的值为 0MAX 的值为 94,而 startChar 的值为 !,它是 ASCII 表中第一个可打印的字符(十进制 ASCII 码为 33)。因此,所有生成的 ASCII 字符都位于 !~ 之间,后者的十进制 ASCII 码为 126

因此,生成的每个随机数都大于 MIN,小于 MAX,并转换为 ASCII 字符。该过程继续进行,直到生成的密码达到指定的长度。

randomPass.go 实用程序接受单个(可选)命令行参数,以定义生成密码的长度,默认值为 8,这是一个非常常见的密码长度。执行 randomPass.go 会得到类似下面的输出:

$ go run randomPass.go 1
Z
$ go run randomPass.go 10
#Cw^a#IwkT
$ go run randomPass.go
Using default values!
[PP8@'Ci

最后一个细节:不要忘记调用 rand.Seed(),并提供一个 种子 seed 值,以初始化随机数生成器。如果你始终使用相同的种子值,随机数生成器将生成相同的随机整数序列。

随机数生成代码

你可以在 GitHub 找到 random.gorandomPass.go 的源码。你也可以直接在 play.golang.org 上执行它们。

我希望这篇文章对你有所帮助。如有任何问题,请在下方发表评论或在 Twitter 上与我联系。


via: https://opensource.com/article/18/5/creating-random-secure-passwords-go

作者:Mihalis Tsoukalos 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Firefox 拦截了中国用户下载广告拦截扩展

蓝点网报道,Firefox 中国版以及国际版均已阻止了中国大陆用户访问其广告拦截扩展的下载页面,而在其它地区则没有被屏蔽。当用户尝试访问时会提示“此页面在您的地区不可用”,返回代码为 “HTTP 451 出于法律原因不可用”。但通过其它方式安装的拦截扩展目前可以正常工作。受影响的广告拦截扩展包括 uBlock Origin、AdGuard AdBlocker 等多款知名广告拦截器。据悉,此次屏蔽可能与芒果 TV 和酷 6 网对 Mozilla 基金会的中国子公司谋智的起诉有关。诉讼原因是 Firefox 安装广告拦截程序后可以屏蔽上述视频网站的片头广告,给原告方带来严重经济损失。Mozilla 在败诉后,提起上述,依然败诉。

老王点评:万恶的广告(商)!

以消除密码为己任的 FIDO 联盟

FIDO 联盟成员包括各大科技公司,其使命为减少世界上“对密码的过度依赖”,以最终实现大规模采用 替代密码的技术。无密码的 FIDO 标准依靠设备的生物识别扫描器(或你选择的主密码)来对你进行本地认证,而不需要将你的任何数据通过互联网传送到网络服务器上进行验证。其主要思路是让操作系统实现一个“FIDO 凭证”管理器,这有点类似于内置的密码管理器。这种机制是存储可以在设备之间同步的加密密钥,并由你的设备的生物识别或密码锁进行保护。

老王点评:密码系统因其屡屡成为安全短板而被人诟病,但是密码系统的结构非常简单,而这种无密码系统似乎又过于复杂了。我总觉得没有银弹,无密码系统或许也有它的问题。

Linux 内核的随机数生成器获得十余年来的重大改进

Linux 内核的 随机数生成器(RNG)不仅在 5.17 中最终废除了 SHA-1,转而使用 BLAKE2s,而且还将在 5.18 中将 /dev/random/dev/urandom 统一起来,使它们之间没有任何区别。所以现在选择哪一个都是正确的,社区的争吵可以停止了。目前还没有改变 RNG 行为方式的任何根本。它仍在计算熵位,并拥有与以前相同的熵源集。但是,将这些熵源转化为加密安全的随机数的底层算法已经被彻底修改了。

老王点评:终于在 WireGuard 创始人的出手后,Linux 的 RNG 开始追上其它操作系统了。

以太坊创始人说,加密货币冬天将受到顶级开发者的欢迎

最近几周,加密货币与股票一起下跌。以太坊创始人 Vitalik 说,“那些深入研究加密货币的人,尤其是建造东西的人,很多人都欢迎熊市”。因为这种下滑可以清理掉不太可行的项目。他认为,价格下跌将好奇的人与严肃的人分开。这就是为什么“加密货币的冬天” —— 当价格不断崩溃并在很长一段时间内无法恢复 —— 可以被视为一个积极的因素,你可以看到哪些项目实际上是长期可持续的。但是,另外一方面,一些将毕生积蓄投入加密货币的人在下跌后承受了巨大的精神压力。

老王点评:对于那些不喜欢加密货币的人,是不是也乐于见到这种局面?

时隔五年后,FreeDOS 1.3 释出

MS-DOS 的开源替代品 FreeDOS 正式发布了 1.3 版。其主要变化包括:新的命令行解释器 FreeCOM、新的内核、支持 FAT32,软盘版本使用了压缩减少了一半容量需求,再次支持网络,新的程序和游戏,软件包更新等等。最简安装需要 20MB、包括游戏和应用的完整安装需要 275MB。FreeDOS 项目发起于 1994 年,2006 年才发布了 1.0 正式版,2012 年发布了 1.1 版本,2016 年底发布了 1.2 版本。

老王点评:虽然应用场景和受众很少,但这是一种选择的自由。

Linux 内核中获取随机字节的函数的性能提升了 8450%

操作系统内核中的随机数是很多基础功能的基石,因此人们一方面在改进其随机性,另外一方面也在不断改进其性能。在 Linux 5.17 中替换了 SHA1 算法改进了安全性和性能,而在 5.18 中还将继续改进。最令人兴奋的是,在新的改进中,获取随机字节的 getrandom() 调用的性能 提升了 8450%,即 85 倍多。这主要得益于“在每 CPU 密钥上使用更简单的快速密钥擦除流”。受此影响,最显著的收益将出现在高核心数的服务器上和台式机上。

老王点评:或许你不理解其中的技术细节,那就一句话,快就是了。

周易 AI 加速器因缺乏开源客户端而无法进入 Linux 内核主线

周易 AI 加速器是由 Arm 中国开发的,目前已经用在一些 SoC 中,如全志 R329。一位百度工程师发布了一个超过五千行代码的新内核驱动,实现了对它的支持。但是这个驱动目前只能进入暂存区,而无法进入 Linux 内核主线,因为 Arm 中国只是以二进制方式分发了用户空间组件(客户端),而没有提供它的源代码。甚至开发该驱动的开发者似乎也没有用户空间的源代码,而是要靠逆向工程来实现。

老王点评:这种闭源而小众的硬件,Linux 内核是不欢迎的。

开发了五年的新 Linux 随机数发生器仍然无法进入内核主线

LRNG 是 Linux 上的一个新的 /dev/random 实现,它已经开发了五年多。它采用与现有内核实现不同的设计,但是完全兼容现有的接口。由于加密处理的改进、大型并行系统更好的可扩展性、关键代码路径中高达 130% 的性能提升等等,这个实现更加出色。但是这个新的随机数发生器何时能进入 Linux 内核,目前还需要拭目以待。

老王点评:随机数的实现看似简单和基础,但是其实是整个安全系统的基石,所以内核对它非常慎重。

三分之一的暗网域名现在是 V3 洋葱网站

过去两年,Tor 匿名网络经历了一个重大变化,.onion 域名取消了被称为 V2 地址的 16 个字符长的域名,取而代之的是被称为 V3 的 56 个字符长的域名。据调查,目前 62% 是 V2 地址,38% 是 V3 地址。Tor 团队在 9 月自己的 V2-V3 分析中指出,预计 V2 网站将在未来一年内绝迹。

老王点评:V3 域名给对洋葱网络上的非法内容打击增加了困难。

“Linux 随机数生成器”(LRNG) 已经开发了五年

作为 /dev/random 的新替代品,“Linux 随机数生成器”(LRNG)已经进行了第 41 次修订,对它的开发了已经超过了 5 年。LRNG 是对现有随机数生成器的 API/ABI 兼容的替代品。LRNG 的目标是提高速度,以及其他各种性能优化,各种加密处理的改进,测试能力的提高,选项的更大可配置性,并且是一个更现代的设计。LRNG 是否以及何时可以进入 Linux 主线还有待观察。

看似简单的随机数,其实是计算安全上最重要的基石之一,也可能是这个宇宙最重要的基础之一。

新研究确认 Rust 的安全性

Rust 有两种模式:其默认的安全模式和不安全模式。在其默认的安全模式下,Rust 可以防止内存错误和数据竞争。而在它的不安全模式下允许使用潜在的不安全的 C 风格的函数。验证 Rust 的安全声明的关键挑战是说明其安全和不安全代码之间的互动。

一篇发表在 4 月份的《ACM 通讯》的文章对 Rust 的安全性进行了研究。其共同作者,“我们能够验证 Rust 类型系统的安全性,从而表明 Rust 是如何自动和可靠地防止这一类编程错误的。”他们开发了一个理论框架,能够证明尽管有可能写出“不安全”的代码,但 Rust 的安全主张仍然成立。他们使用一个叫做 Miri 的工具来自动测试“不安全”的 Rust 代码是否符合 Rust 规范。

“不安全”的代码仍然能保证安全才是 Rust 最有趣的地方。

大量比特币矿工前往美国

美国已经迅速成为比特币挖矿世界的新宠。截至 2021 年 4 月,美国已经占世界所有比特币矿工的近 17%。这比 2020 年 9 月增加了 151%。此外,在中国禁止挖矿后,50 万台以前的中国矿工的矿机正在美国寻找家园。如果他们被部署,这将意味着到 2022 年底,北美将拥有接近 40% 的全球哈希率。多年来,美国一直在悄悄地建立其托管能力。美国也是地球上一些最便宜的能源的所在地,其中许多是可再生能源。大多数搬迁到北美的新矿工将使用可再生能源,或用可再生能源信贷抵消的天然气。

让这些能源消耗和风险去祸害他们去吧,对吧。

当谈到 /dev/random/dev/urandom 的主题时,你总是会听到这个词:“ Entropy ”。每个人对此似乎都有自己的比喻。那为我呢?我喜欢将熵视为“随机果汁”。它是果汁,随机数需要它变得更随机。

如果你曾经生成过 SSL 证书或 GPG 密钥,那么可能已经看到过像下面这样的内容:

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++..+++++.+++++++++++++++.++++++++++...+++++++++++++++...++++++
+++++++++++++++++++++++++++++.+++++..+++++.+++++.+++++++++++++++++++++++++>.
++++++++++>+++++...........................................................+++++
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 290 more bytes)

通过在键盘上打字并移动鼠标,你可以帮助生成熵或随机果汁。

你可能会问自己……为什么我需要熵?以及为什么它对于随机数真的变得随机如此重要?那么,假设我们的熵的来源仅限于键盘、鼠标和磁盘 IO 的数据。但是我们的系统是一个服务器,所以我知道没有鼠标和键盘输入。这意味着唯一的因素是你的 IO。如果它是一个单独的、几乎不使用的磁盘,你将拥有较低的熵。这意味着你的系统随机的能力很弱。换句话说,我可以玩概率游戏,并大幅减少破解 ssh 密钥或者解密你认为是加密会话的时间。

好的,但这是很难实现的对吧?不,实际上并非如此。看看这个 Debian OpenSSH 漏洞。这个特定的问题是由于某人删除了一些负责添加熵的代码引起的。有传言说,他们因为它导致 valgrind 发出警告而删除了它。然而,在这样做的时候,随机数现在少了很多随机性。事实上,熵少了很多,因此暴力破解变成了一个可行的攻击向量。

希望到现在为止,我们理解了熵对安全性的重要性。无论你是否意识到你正在使用它。

/dev/random 和 /dev/urandom

/dev/urandom 是一个伪随机数生成器,缺乏熵它也不会停止。

/dev/random 是一个真随机数生成器,它会在缺乏熵的时候停止。

大多数情况下,如果我们正在处理实际的事情,并且它不包含你的核心信息,那么 /dev/urandom 是正确的选择。否则,如果就使用 /dev/random,那么当系统的熵耗尽时,你的程序就会变得有趣。无论它直接失败,或只是挂起——直到它获得足够的熵,这取决于你编写的程序。

检查熵

那么,你有多少熵?

[root@testbox test]# cat /proc/sys/kernel/random/poolsize
4096
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
2975

/proc/sys/kernel/random/poolsize,说明熵池的大小(以位为单位)。例如:在停止抽水之前我们应该储存多少随机果汁。/proc/sys/kernel/random/entropy_avail 是当前池中随机果汁的数量(以位为单位)。

我们如何影响这个数字?

这个数字可以像我们使用它一样耗尽。我可以想出的最简单的例子是将 /dev/random 定向到 /dev/null 中:

[root@testbox test]# cat /dev/random > /dev/null &
[1] 19058
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
0
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
1

影响这个最简单的方法是运行 Haveged。Haveged 是一个守护进程,它使用处理器的“抖动”将熵添加到系统熵池中。安装和基本设置非常简单。

[root@b08s02ur ~]# systemctl enable haveged
Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.
[root@b08s02ur ~]# systemctl start haveged

在流量相对中等的机器上:

[root@testbox ~]# pv /dev/random > /dev/null 
  40 B 0:00:15 [   0 B/s] [                    <=>                                                                                                                                                      ]
  52 B 0:00:23 [   0 B/s] [                           <=>                                                                                                                                               ]
  58 B 0:00:25 [5.92 B/s] [                              <=>                                                                                                                                            ]
  64 B 0:00:30 [6.03 B/s] [                                  <=>                                                                                                                                        ]
^C
[root@testbox ~]# systemctl start haveged
[root@testbox ~]# pv /dev/random > /dev/null 
7.12MiB 0:00:05 [1.43MiB/s] [                <=>                                                                                                                                                        ]
15.7MiB 0:00:11 [1.44MiB/s] [                                    <=>                                                                                                                                    ]
27.2MiB 0:00:19 [1.46MiB/s] [                                                               <=>                                                                                                         ]
  43MiB 0:00:30 [1.47MiB/s] [                                                                                                    <=>                                                                    ]
^C

使用 pv 我们可以看到我们通过管道传递了多少数据。正如你所看到的,在运行 haveged 之前,我们是 2.1 位/秒(B/s)。而在开始运行 haveged 之后,加入处理器的抖动到我们的熵池中,我们得到大约 1.5MiB/秒。


via: http://jhurani.com/linux/2017/11/01/entropy-explained.html

作者:James J 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出