在 linux 中创建密码的一种方法?

信息安全 密码 linux 随机的
2021-09-01 23:09:53

如何使用 bash 一行来创建可读密码?如果我正在寻找 128 位的熵怎么办?

编辑

可读我的意思是94 个可打印的 ascii 字符(没有空格)只要它具有至少 128 位的熵,它就可以使用少于这些字符的字符。

4个回答

这取决于您所说的“可读”是什么意思。如果您只想使用十六进制字符,则需要其中的 32 个才能达到 128 位的熵;此行将起作用(仅使用coreutils包中的命令):

head -c16 /dev/urandom | md5sum

这个变体产生的密码只有小写字母,从“a”到“p”(如果你必须在智能手机上“输入”密码,这就是你想要的):

head -c16 /dev/urandom | md5sum | tr 0-9 g-p

如果你想少输入一个字符,试试这个:

head -16 /dev/urandom | md5sum

(将所有前 16 个随机字节作为 0x0A 即“换行符”字符的概率为 2 -128,因此该行仍然获得 128 位熵。)

仍然限制自己使用来自 的命令coreutils,您可以这样做:

mktemp -u XXXXXXXXXXXXXXXXXXXXXX

这个生成一个 22 个字符的密码,/dev/urandom用作内部随机源(我检查了源代码,并strace确认了呼叫)。字符是字母(大写和小写)和数字;因为 62 22大于 2 128,所以 22 个字符就足够了。

还有一个:

od -An -x /dev/urandom | head -1

这将显示八个由四个十六进制数字组成的序列。可以说,这种分成小序列可能有助于阅读。

对于更长的行和完全不同的密码,试试这个:

for i in {1..8} ; do head -$(expr $(head -c7 /dev/urandom | od -An -t dL) % $(wc -l < /usr/share/dict/british-english)) /usr/share/dict/british-english | tail -1 ; done

(这个仅适用于 64 位主机;您会注意到原因吗?)。除了coreutils,该版本还需要一个字典文件,这里是英式英语。

其他答案中的一些工厂建议。我发现 makepasswd 并非在任何地方都可用,并且使用 tr (有点)棘手,所以还有另一个使用 OpenSSL 的选项:

openssl rand -base64 16

该数字是随机的字节数 - 因此 128 位熵为 16 个字节。

使用 pwgen

有史以来最简单的单线器:

pwgen

它试图制作易于记忆的密码。要禁用它并创建更安全的密码,请使用--secureor-s标志。

pwgen -s

生成的密码是否太长?太短?只需附加所需的长度:

pwgen 9
# Or
pwgen -s 9
# Or
pwgen 9 -s

类似的工具

我只是碰巧知道 pwgen,还有其他工具。您可以使用发行版中的搜索功能找到它们。在 Debian 中是:

apt-cache search password generator

它确实进行了精确的(尽管不区分大小写)搜索。使用password generat代替扩大了搜索范围。

在安装软件包之前,查看它的描述会很有用。再次在 Debian 中:

apt-cache show $DESIRED_PACKAGE
# E.g.
apt-cache show pwgen

我可以通过这种方式找到的工具:

  • pwgen
  • makepasswd
  • apg
  • otp (用于一次性垫,不推荐)
  • gpw (非常注重发音,不推荐)

使用标准的 Unix 工具

并非所有系统都可以使用 pwgen。就像其他人回答的那样,您可以使用md5sumor sha256sum,但仅输出 0-9 和 af。没有 gz 或大小写混合,更不用说特殊字符了。最好简单地过滤掉不可打印的字符,/dev/urandom直到您获得所需长度的密码:

cat /dev/urandom | tr -cd '@-~' | head -c 8

这给出了类似的东西XiVsdn[yor V@FPV^lY您可以8将末尾的 更改为所需的密码长度。您还可以更改@-~部分以限制字符。例如,这将只打印字母数字字符:

cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 8

这几乎与将pwgen -s要执行的操作相同,并提供类似nZiUzNtE.

作为奖励,该tr工具几乎包含在除 Microsoft Windows 之外的所有操作系统(Mac OS X、GNU/Linux、Android/Linux、Solaris、FreeBSD 等)中。

根据您可能包含的字符类型,创建具有 128 位熵的可读密码的简单命令如下所示:

< /dev/urandom tr -dc [:graph:] | head -c20; echo;

(取自这里)。[:graph:]都是 ascii pritable 字符,除了空格。

解释:

128 位相当于3.40e+38组合。如果您使用94 个可读的 ascii 字符(空格除外) ,则至少需要20 个字符才能达到这样的组合数量: 94^20 = 2.90e+39

例如,如果您只允许使用_A-Za-z0-9

< /dev/urandom tr -dc '_A-Za-z0-9' | head -c22; echo;

对于 63 个可能的字符:63^22 = 3.85e+39它只添加两个字符即可达到全熵。

对于十六进制密码:

< /dev/urandom tr -dc 'A-F0-9' | head -c32; echo;

十六进制很简单:128 位是十六进制字符位数的 32 倍。

重要提示:在大多数需要密码的情况下,您将在后面使用哈希函数,该函数实际上会派生将要使用的真实字符串。此分析取决于密码的哈希/使用方式。

附加说明/dev/urandom对于此操作是安全的。请检查/dev/urandom 的 rand 对于登录密钥是否安全?.

附加说明:如果您对哈希函数使用多个迭代,则可以减去表示您可以达到的总位数的迭代所需的位,例如:

65536次迭代 = 2^16次迭代,将大约16 位(2 个字节)的熵添加到选择的密码中,因为在暴力攻击中,您需要在计算使用的哈希之前执行 2^16 次额外的迭代。

只是为了记录,超过 128 位的熵是不必要的,正如这里所解释的:全人类安全无法实现的简单操作的数量?

但如果你的偏执超出了这个范围,这里有一些有用的数字:

所有 ascii可读(29 个字符,1.6e+57 组合),192 位(6.28e+57 组合)熵:

< /dev/urandom tr -dc [:graph:] | head -c29; echo;

_A-Za-z0-932个字符,3.79e+57组合),192位(6.28e+57组合)熵:

< /dev/urandom tr -dc '_A-Za-z0-9' | head -c32; echo;

A-F0-948 个字符,16^48 组合),192 位(2^192 组合)熵:

< /dev/urandom tr -dc 'A-F0-9' | head -c48; echo;

所有 ascii可读(39 个字符,8.95e+76 组合),256 位(1.16e+77 组合)熵:

< /dev/urandom tr -dc [:graph:] | head -c39; echo;

_A-Za-z0-943个字符,2.35e+77组合),256位(1.16e+77组合)熵:

< /dev/urandom tr -dc '_A-Za-z0-9' | head -c43; echo;

A-F0-964 个字符,16^64 组合),256 位(2^256 组合)熵:

< /dev/urandom tr -dc 'A-F0-9' | head -c64; echo;

考虑到最后六个选项已经是偏执的,选择比上述密码更复杂或更大的密码是完全没有意义的。