我需要生成多个随机密码,并遇到了内置 base64 编码的“openssl rand -base64 14”命令。
sh-3.2# openssl rand -base64 14
ktMgWKno9AbvRUq4wx0=
但是,一旦生成,我想将密码解密为可用/人类可读的格式。但是,在解码时,我只看到不可读的值。
sh-3.2# echo ktMgWKno9AbvRUq4wx0= | base64 --decode
�� X����EJ��sh-3.2#
你们如何解密这些并使用?
tl;博士
在您遇到的方法中,格式
ktMgWKno9AbvRUq4wx0=
是人类可读的;这正是您所需要的。详细解答
一个误会。它的两个部分:
openssl rand
生成伪随机字节。不能保证它们将是可打印的或人类可读的。因此,您要求(通常)编码为文本的二进制数据。
ktMgWKno9AbvRUq4wx0=
是人类可读的形式。您“解密”(或更确切地说“解码”;Base64 是一种编码,而不是加密)的命令是有效的,但它为您提供了该工具在没有-base64
.您可以使用
openssl rand -base64 14
给您的密码作为人类可读的密码。我想这就是您遇到的解决方案的要点。每个字符都ktMgWKno9AbvRUq4wx0=
携带原始二进制序列的 6 位熵,除了之前=
的那个和它=
本身:0=
序列携带 4 位。总共你有 18×6+4 位的熵,这正是你要求的 14×8。整个字符串的长度为 20 个字符。为了最大化(在方法内)存储在 20 个字符中的熵,您应该至少需要 20x6 位并取前 20 个字符。20x6 正好是 15x8,所以这个命令将准确生成您需要的 20 个字符(无需截断)。这将是一个人类可读的字符串,其长度与所讨论的字符串相同,但其中的熵多了 8 位。
我说“方法内最大化”是因为“方法外”可以为每个人类可读字符打包更多的熵。如果您允许使用不属于 Base64 字符集的其他字符(例如
%
,_
,#
),那么每个字符将获得超过 6 位。你不能用额外的字符扩展方法,因为“每个字符 6 位”就像 Base64 的基础。要获得每个角色更多的熵,您需要一种完全不同的方法。使用所有 95 个可打印 ASCII 字符的方法将为每个字符提供大约 6.5 位的熵(严格来说:log 2 95)。