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

yog*_*raj 3 linux passwords openssl random

我需要生成多个随机密码,并遇到了“openssl rand -base64 14”命令,该命令内置了 base64 编码。

\n\n
sh-3.2# openssl rand -base64 14\nktMgWKno9AbvRUq4wx0=\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,一旦生成后,我想将密码解密为可用/人类可读的格式。但是,在解码时,我只看到不可读的值。

\n\n
sh-3.2# echo ktMgWKno9AbvRUq4wx0= | base64 --decode\n\xef\xbf\xbd\xef\xbf\xbd X\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdEJ\xef\xbf\xbd\xef\xbf\xbdsh-3.2#\n
Run Code Online (Sandbox Code Playgroud)\n\n

你们如何解密并使用这些?

\n

Kam*_*ski 7

太长了;博士

\n\n

ktMgWKno9AbvRUq4wx0=在该方法中,您遇到了人类可读的格式;这正是您所需要的。

\n\n
\n\n

详细解答

\n\n
\n

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

\n
\n\n

一个误会。它的两个部分:

\n\n
    \n
  1. openssl rand生成伪随机字节。无法保证它们可打印或可供人类阅读。
  2. \n
  3. Base64 编码的全部要点是将任意二进制数据表示为文本(因此它可以跨仅可靠支持文本内容的通道传输)。碰巧文本是可打印且可读的。
  4. \n
\n\n

因此,您要求(通常)编码为文本的二进制数据。ktMgWKno9AbvRUq4wx0=是人类可读的形式。您的“解密”命令(或者更确切地说“解码”;Base64 是一种编码,而不是加密)是有效的,但它为您提供了该工具在没有-base64.

\n\n

您可以使用openssl rand -base64 14为您提供的密码作为人类可读的密码。我想这就是您遇到的解决方案的要点。中的每个字符ktMgWKno9AbvRUq4wx0=恰好携带原始二进制序列的 6 位熵,除了前一个字符=和它=本身:0=序列携带 4 位。总共你有 18\xc3\x976+4 位熵,这正是你要求的 14\xc3\x978 。整个字符串有 20 个字符长。为了最大化(在方法内)存储在 20 个字符中的熵,您应该至少需要 20x6 位并获取前 20 个字符。20x6 正好是 15x8,所以这个命令

\n\n
openssl rand -base64 15\n
Run Code Online (Sandbox Code Playgroud)\n\n

将准确生成您需要的 20 个字符(无需截断)。这将是一个人类可读的字符串,其长度与所讨论的字符串相同,但其中多了 8 位熵。

\n\n

我说“在方法内最大化”是因为“在方法外”可以为每个人类可读字符打包更多的熵。如果您允许使用不属于 Base64 字符集的其他字符(例如%_#),那么每个字符将获得超过 6 位。

\n\n

您无法使用其他字符扩展该方法,因为“每个字符 6 位”就像 Base64 的基础。为了获得每个角色更多的熵,你需要一种完全不同的方法。使用全部 95 个可打印 ASCII 字符的方法将为每个字符提供大约 6.5 位的熵(严格来说:log 2  95)。

\n