複数のランダムパスワードを生成する必要があり、base64エンコーディングが組み込まれている「opensslRand-base6414」コマンドに出くわしました。
sh-3.2# openssl Rand -base64 14
ktMgWKno9AbvRUq4wx0=
しかし、生成後、パスワードを使用可能/人間が読める形式に復号化したいと思います。しかし、デコードすると、読み取り不可能な値しか表示されません。
sh-3.2# echo ktMgWKno9AbvRUq4wx0= | base64 --decode
�� X����EJ��sh-3.2#
これらをどのように復号化して使用しますか?
この方法では、ktMgWKno9AbvRUq4wx0=
のような形式は人間が読める形式です。これはまさにあなたが必要とするものです。
パスワードを使用可能/人間が読める形式に復号化します。
誤解。それの2つの部分:
openssl Rand
は疑似ランダムを生成しますバイト。印刷可能または人間が読める形式であるという保証はありません。そこで、(一般的に)テキストとしてエンコードされたバイナリデータを要求しました。 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)。