web-dev-qa-db-ja.com

opensslエラーのある文字列の暗号化/復号化

Bashスクリプトを使用してパスワードを暗号化および復号化する必要があります。そのために、私はopensslを使用しています。

ホスト間でパスワードを移動するため、復号化が必要です。

奇妙なことに、暗号化には有効期限があるようです。

暗号化するには(bashスクリプトではありません):

echo P@$$Word| openssl enc -aes-128-cbc -a -salt -pass pass:pass_key

復号化するには(bashスクリプトで):

dec_password=$(echo -n $1 | openssl enc -aes-128-cbc -a -d -salt -pass pass:pass_key)

暗号化を行ってからスクリプトを実行すると、完全に機能します。
ただし、暗号化を行っていて翌日、復号化用のスクリプトを実行している場合エラーで失敗します:

error reading input file

時間が関連しているかどうかはわかりませんが、変更された変数はそれだけです。

何か案は?ありがとう

3
Bar

パスワードを復号化するためにしばらく待った後に発生するエラーで、メソッドに「有効期限がある」とのことですが、これはランダムに生成されたsaltが時間とともに変化するためです。 (例:毎日異なります)

暗号化する場合、暗号化されたパスワードの最初の文字は、ソルトで暗号化するときに使用されるソルトです。復号化には同じソルトを使用する必要があります。

MacOS /以前では、ソルトなしで暗号化しようとしている場合は注意してください。 opensslバージョンでは、-nosaltkeywordを使用する必要があります。 opensslは、デフォルトでソルトを生成して使用します。

したがって、ソルトなしで暗号化するには、次のことを行う必要があります。

echo P@$$Word| openssl enc -aes-128-cbc -a -nosalt -pass pass:pass_key

ただし、パスワードを保存する場合は、パスワードを復号化して候補パスワードと比較することはお勧めできません。後でスクリプトを比較するためにスクリプトを復号化しません

パスワードを比較するには、パスワードを暗号化して同じソルト(ソルトを使用している場合)で確認し、暗号化された文字列を比較して一致するかどうかを確認します。

システム間でパスワードを転送し、保存しない場合は、saltの使用はそれほど重要ではありませんが、より安全に保つのに役立つことに注意してください。

ただし、暗号化の強度に関して強いセキュリティニーズがある場合、OpenSSLは暗号化の強度が弱いことで知られており、GnuPGはopenSSLよりも暗号化に強いです。

4
Rui F Ribeiro
$ echo P@$$Word
P@74266Word

$ echo 'P@$$Word'
P@$$Word

常に文字列を引用することを忘れないでください。また、$1などの二重引用符の変数展開:

$ ls
a_file

$ variable="a*"

$ echo $variable
a_file

$ echo "$variable"
a*

また、パスワードを比較するには、復号化されたパスワードではなく、暗号化されたパスワードを比較する必要があります。ソルトを使用する場合は、元のパスワードの暗号化に使用したのと同じソルトを使用する必要があります。 OpenSSLは、これを暗号化されたデータの最初の8バイトに格納します。

2
Kusalananda