获取可打印/字母数字字符的随机序列的最佳方法是什么?

获取可打印/字母数字字符的随机序列的最佳方法是什么?

'/dev/random'我知道我可以从(或)获取不受约束的随机(伪随机)字符/dev/urandom。但如果我需要这些字符来生成文件名怎么办?我需要以某种方式获得可打印字符流或序列,或者为了安全起见,使用字母数字字符。在 shell 中执行此操作的最佳方法是什么?

(我知道理论上我可以tr对字符进行操作/dev/random但这听起来不是正确的做法。)

答案1

我所看到的/usr/bin/jot能够提供指定数量的受限随机字符,这些字符可以重新整形为适合文件名的单词。可能有一种更简洁的方式来指定所有可打印字符,但我对 shell 脚本有点生疏。

[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
EUCGGSIOIDMPCHXCHIGYXBYWJ
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
PMKQQZOCYETVIHIMTIQFYTFZK
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
CXBKEFSIRCOOGUICJPOMZKMSG
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
MEHSFOSHLKKJRKQLRCXUCBJAD
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
ZCCGKYIWLBTJUVIHQBCHXCVEU

答案2

$ dd if=/dev/urandom of=/dev/stdout bs=124 count=1 2>/dev/null | sha256sum | awk '{print $1}'

答案3

对@dawud 的修改解决方案

dd if=/dev/urandom bs=124 count=1 2>/dev/null | sha256sum | cut -c1-64

为您提供 64 个字符;并且您可以/dev/random在没有 的 UN*X 系统上使用/dev/urandom

根据@NevinWilliam 的建议,一种不同的、更简单的方法:只需这样做

date +%s.%N

没有字母字符是字母数字的特殊情况......这并不涵盖可能的字符串的整个范围,并且限制为 9 个字符,并且它不是很随机 - 除了可能最后 2-4 位数字左右 - 但由于我们不进行加密,这应该足够好了。

答案4

在 urandom 字符串上使用 base64 将解决所有编码问题。您应该尝试:

$ dd if=/dev/urandom bs=32 count=1 2>/dev/null |base64
A5o88RTh2LZlsr9F2r3jRPSqBZMMaa1EIAyndnVYhAQ=

更改 bs 参数以获取预期长度。您还可以删除最后一个字符,因为它是 base64 尾随字符。

相关内容