我需要生成多个随机密码,并遇到了内置执行 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#
你们如何解密并使用它们?
答案1
总结
在该方法中,您遇到的格式ktMgWKno9AbvRUq4wx0=
是人类可读的;这正是您所需要的。
详细解答
将密码解密为可用/人类可读的格式。
这是一个误会。它包括两个部分:
openssl rand
生成伪随机数字节. 无法保证它们是否可以打印或是否可供人类阅读。- Base64 编码的重点是将任意二进制数据表示为文本(因此它可以通过仅可靠支持文本内容的通道传输)。因此,文本是可打印且可读的。
因此,您要求(一般来说)将二进制数据编码为文本。ktMgWKno9AbvRUq4wx0=
是人类可读的形式。您的“解密”(或更确切地说是“解码”;Base64 是一种编码,而不是加密)命令是有效的,但它会为您提供二进制数据该工具将会产生没有-base64
。
您可以使用openssl rand -base64 14
您给出的可读密码。我猜这是您遇到的解决方案的要点。中的每个字符都ktMgWKno9AbvRUq4wx0=
恰好带有原始二进制序列的 6 位熵,除了之前的那个=
和它=
本身:0=
序列带有 4 位。总共有 18×6+4 位熵,这正是您要求的 14×8。整个字符串长 20 个字符。要最大化(在方法内)存储在 20 个字符中的熵,您应该至少需要 20x6 位并取前 20 个字符。20x6 正好是 15x8,所以这个命令
openssl rand -base64 15
将生成您所需的 20 个字符(无需截断)。这将是一个人类可读的字符串,其长度与所讨论的字符串相同,但其中的熵多 8 位。
我说“在方法内最大化”,因为“在方法之外”可以为每个人类可读的字符打包更多的熵。如果您允许不属于 Base64 字符集的其他字符(例如%
,, ) _
,#
那么每个字符将获得超过 6 位。
您无法通过添加其他字符来扩展该方法,因为“每个字符 6 位”就像 Base64 的基础一样。要获得每个字符的更多熵,您需要一种完全不同的方法。使用所有 95 个可打印 ASCII 字符的方法将为您提供每个字符约 6.5 位的熵(严格来说:log 2 95)。