文字列の暗号化/暗号化解除中にopensslエラーが発生しました。

文字列の暗号化/暗号化解除中に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

時間が関係しているかどうかはわかりませんが、それが変更される唯一の変数です。

どんなアイデアがありますか?ありがとう

答え1

パスワードを解読するためにしばらく待ってから発生するエラーと、その方法に「有効期限があるようだ」と言及された理由は、生成された乱数が時間の経過saltとともに変化するためです。 (例:毎日異なります)

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

以前のバージョンの MacOS/? で無ソルト暗号化を実行する場合は注意してください。 opensslバージョンでは-nosaltキーワードを使用する必要があります。opensslデフォルトでは salt が生成され使用されます。

したがって、ソルトレス暗号化を実行するには、次のことが必要です。

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

しかし、パスワードを保存するときにパスワードを復号化し、後でスクリプトを比較するのは悪い習慣です。あなたはそれを解読しません:

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

パスワードを保存するのではなく、システム間でパスワードを渡すためのものであれば、それを使用することはsaltそれほど重要ではありませんが、セキュリティを維持するのに役立ちます。

ただし、暗号強度の強力なセキュリティ要件がある場合、OpenSSLは暗号強度が弱いのに対し、GnuPGはopenSSLよりも暗号強度が強くなります。

答え2

$ 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バイトに保存します。

関連情報