web-dev-qa-db-ja.com

「opensslRand-base6420」によって生成されたパスワードを復号化する方法

複数のランダムパスワードを生成する必要があり、base64エンコーディングが組み込まれている「opensslRand-base6414」コマンドに出くわしました。

sh-3.2# openssl Rand -base64 14
ktMgWKno9AbvRUq4wx0=

しかし、生成後、パスワードを使用可能/人間が読める形式に復号化したいと思います。しかし、デコードすると、読み取り不可能な値しか表示されません。

sh-3.2# echo ktMgWKno9AbvRUq4wx0= | base64 --decode
�� X����EJ��sh-3.2#

これらをどのように復号化して使用しますか?

2
yog raj

tl; dr

この方法では、ktMgWKno9AbvRUq4wx0=のような形式は人間が読める形式です。これはまさにあなたが必要とするものです。


詳細な回答

パスワードを使用可能/人間が読める形式に復号化します。

誤解。それの2つの部分:

  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文字セットに属さない追加の文字(例:%_#)を許可すると、1文字あたり6ビットを超える文字が取得されます。

「1文字あたり6ビット」はBase64の基盤のようなものであるため、追加の文字でメソッドを拡張することはできません。文字ごとのエントロピーを増やすには、まったく異なるアプローチが必要です。 95個の印刷可能なすべてのASCII文字を使用する方法では、文字ごとに約6.5ビットのエントロピーが得られます(厳密には:log295)。

2