如何对 /dev/random 或 /dev/urandom 进行 base64 编码?

Posted

技术标签:

【中文标题】如何对 /dev/random 或 /dev/urandom 进行 base64 编码?【英文标题】:How to base64 encode /dev/random or /dev/urandom? 【发布时间】:2010-11-18 00:29:02 【问题描述】:

cat /dev/urandom 在显示器上创建滚动字符始终是一种有趣的方式,但会产生太多不可打印的字符。

是否有一种简单的方法可以在命令行上对其进行编码,使其所有输出都是可读字符,例如 base64 或 uuencode。

请注意,我更喜欢不需要创建额外文件的解决方案。

【问题讨论】:

你对“有趣”的定义绝对不同寻常。 【参考方案1】:

类似的东西呢

cat /dev/urandom | base64

它提供了(很多)类似

的东西
hX6VYoTG6n+suzKhPl35rI+Bsef8FwVKDYlzEJ2i5HLKa38SLLrE9bW9jViSR1PJGsDmNOEgWu+6
HdYm9SsRDcvDlZAdMXAiHBmq6BZXnj0w87YbdMnB0e2fyUY6ZkiHw+A0oNWCnJLME9/6vJUGsnPL
TEw4YI0fX5ZUvItt0skSSmI5EhaZn09gWEBKRjXVoGCOWVlXbOURkOcbemhsF1pGsRE2WKiosvsr
Xj/5swkAA5csea1TW5mQ1qe7GBls6QBYapkxEMmJxXvatxFWjHVT3lKV0YVR3SI2CxOBePUgWxiL
ZkQccl+PGBWmkD7vW62bu1Lkp8edf7R/E653pi+e4WjLkN2wKl1uBbRroFsT71NzNBalvR/ZkFaa
2I04koI49ijYuqNojN5PoutNAVijyJDA9xMn1Z5UTdUB7LNerWiU64fUl+cgCC1g+nU2IOH7MEbv
gT0Mr5V+XAeLJUJSkFmxqg75U+mnUkpFF2dJiWivjvnuFO+khdjbVYNMD11n4fCQvN9AywzH23uo
03iOY1uv27ENeBfieFxiRwFfEkPDgTyIL3W6zgL0MEvxetk5kc0EJTlhvin7PwD/BtosN2dlfPvw
cjTKbdf43fru+WnFknH4cQq1LzN/foZqp+4FmoLjCvda21+Ckediz5mOhl0Gzuof8AuDFvReF5OU

或者,没有(无用的) cat+pipe :

base64 /dev/urandom

(同种输出^^)

编辑:您还可以使用base64--wrap 选项,以避免出现“短线”:

base64 --wrap=0 /dev/urandom

这将删除包装,您将获得“全屏”显示^^

【讨论】:

“我现在看到的都是金发、黑发、红发。” @Stefano:我也是:-D; @alexanderpas:如果看随机滚动字符让你看到那种字符,也许我应该更频繁地看随机字符^^ @alexanderpas: 猫 /dev/urandom | uuencode - | tr -d '0-9' | sed -e 's/([@$&~#(?)+^;])/^[[1m^[[32m\1^[[0m/g' | sed -e 's/([*!])/^[[30m\1^[[0m/g' | sed -e 's/([A-Z])/^[[32m\1^[[0m/g' | tr -d '\n' # 1) 粘贴后将^[转换成ctrl-v esc 2) 可以改进,但是现在累了;) base64 --wrap=0 /dev/urandom |head -c 100 将获得 100 个随机 base64 字符。如果您正在寻找基于 bash 的矩阵式屏幕保护程序,it has been done before :-) head -c128 /dev/urandom | base64 --wrap=0,以避免破坏管道@AdamKatz。【参考方案2】:

许多人建议catting 并通过base64uuencode 进行管道传输。这样做的一个问题是您无法控制要读取的数据量(它将永远持续下去,或者直到您按 ctrl+c)。另一种可能性是使用dd 命令,它可以让您指定在退出之前要读取多少数据。例如,读取 1kb:

dd if=/dev/urandom bs=1k count=1 2>/dev/null | base64

另一个选项是通过管道传递给strings 命令,这可能会在其输出中提供更多的变化(不可打印的字符被丢弃,任何运行至少 4 个可打印字符的 [默认情况下] 都会显示)。 strings 的问题在于它在自己的行上显示每个“运行”。

dd if=/dev/urandom bs=1k count=1 2>/dev/null | strings

(当然你可以用

替换整个命令
strings /dev/urandom

如果你不想让它停下来)。

如果您想要一些真正时髦的东西,请尝试以下之一:

cat -v /dev/urandom
dd if=/dev/urandom bs=1k count=1 2>/dev/null | cat -v

【讨论】:

head -c 100 例如会打印文件的前 100 个字节。 如果使用字符串,您还可以使用附加管道删除换行符:strings /dev/urandom | perl -pe 's/\n//'【参考方案3】:

那么,有什么问题

cat /dev/urandom | uuencode -

?

在第一次尝试并没有实际工作后修复... ::sigh::

顺便说一句——许多 unix 实用程序使用 '-' 代替文件名来表示“使用标准输入”。

【讨论】:

不知道破折号选项。谢谢你教我;) (在这种情况下实际上破折号表示标准输出)cat 的无用使用 - 改为:uuencode /dev/random -【参考方案4】:

关于如何对随机数据进行 base64 编码,已经有几个很好的答案(即cat /dev/urandom | base64)。但是,在您的问题正文中,您会详细说明:

... 在命令行上对 [urandom] 进行编码,使其所有输出都是可读字符,例如 base64 或 uuencode。

鉴于您实际上并不需要可解析的 base64 并且只希望它可读,我建议

cat /dev/urandom | tr -dC '[:graph:]'

base64 仅输出字母数字字符和两个符号(默认为 + 和 /)。 [:graph:] 将匹配任何可打印的非空白 ascii,包括许多 base64 缺少的符号/标点符号。因此使用tr -dC '[:graph:]'会得到更随机的输出,并有更好的输入/输出效率。

我经常使用< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32 来生成强密码。

【讨论】:

无用的使用 cat (UUoC) -- 考虑改为 tr -dC '[:graph:]' </dev/urandom【参考方案5】:

您可以使用 BASH 的 FIFO 管道做更多有趣的事情:

uuencode <(head -c 200 /dev/urandom | base64 | gzip)

【讨论】:

【参考方案6】:
cat /dev/urandom | tr -dc 'a-zA-Z0-9'

【讨论】:

这是错误的做法。它不是 Base64,转换缺少两个符号,所以它更像是 Base62,因此解码的值会有偏差,例如。不是那么随意。【参考方案7】:

试试

xxd -ps /dev/urandom

xxd(1)

【讨论】:

这将产生十六进制/base16 而不是 base64

以上是关于如何对 /dev/random 或 /dev/urandom 进行 base64 编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建/dev/random和/dev/urandom字符设备

hostapd/dev/random/dev/urandom

如何在 BusyBox shell 中生成随机数

/dev/urandom

/dev/random和/dev/urandom的一点备忘

/dev/random