如何解密“openssl rand -base64 20”生成的密码

如何解密“openssl rand -base64 20”生成的密码

我需要生成多个随机密码,并遇到了内置执行 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=是人类可读的;这正是您所需要的。


详细解答

将密码解密为可用/人类可读的格式。

这是一个误会。它包括两个部分:

  1. openssl rand生成伪随机数字节. 无法保证它们是否可以打印或是否可供人类阅读。
  2. 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)。

相关内容