1つのパスワードを使用して1つのファイルを暗号化および復号化したい。
OpenSSLを使用してそれを行うにはどうすればよいですか?
1つのパスワードを使用して1つのファイルを暗号化および復号化したい。
OpenSSLを使用してそれを行うにはどうすればよいですか?
回答:
セキュリティ警告:AES-256-CBCは認証された暗号化を提供せず、オラクル攻撃のパディングに対して脆弱です。代わりに年齢のようなものを使用する必要があります。
暗号化:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
復号化:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
-md sha256
別のマシンでこのファイルを使用する場合は、encodeおよびdecodeコマンドに追加できます。OpenSSLバージョンの非互換性/相違点に対する
gpg
代わりに使用する可能性があるopenssl
ので、この回答の最後にある「その他の注意事項」を参照してください。しかし、以下を使用して質問に答えるにはopenssl
:
暗号化するには:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
復号化するには:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
注:暗号化または復号化するときに、パスワードの入力を求められます。
の情報源としては、httpsopenssl enc
://www.openssl.org/docs/man1.1.1/man1/enc.htmlが最適です。
コマンドライン:
openssl enc
次の形式を取ります:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename]
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P]
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]
あなたの質問に関して最も有用なパラメータの説明:
-e
Encrypt the input data: this is the default.
-d
Decrypt the input data.
-k <password>
Only use this if you want to pass the password as an argument.
Usually you can leave this out and you will be prompted for a
password. The password is used to derive the actual key which
is used to encrypt your data. Using this parameter is typically
not considered secure because your password appears in
plain-text on the command line and will likely be recorded in
bash history.
-kfile <filename>
Read the password from the first line of <filename> instead of
from the command line as above.
-a
base64 process the data. This means that if encryption is taking
place the data is base64 encoded after encryption. If decryption
is set then the input data is base64 decoded before being
decrypted.
You likely DON'T need to use this. This will likely increase the
file size for non-text data. Only use this if you need to send
data in the form of text format via email etc.
-salt
To use a salt (randomly generated) when encrypting. You always
want to use a salt while encrypting. This parameter is actually
redundant because a salt is used whether you use this or not
which is why it was not used in the "Short Answer" above!
-K key
The actual key to use: this must be represented as a string
comprised only of hex digits. If only the key is specified, the
IV must additionally be specified using the -iv option. When
both a key and a password are specified, the key given with the
-K option will be used and the IV generated from the password
will be taken. It probably does not make much sense to specify
both key and password.
-iv IV
The actual IV to use: this must be represented as a string
comprised only of hex digits. When only the key is specified
using the -K option, the IV must explicitly be defined. When a
password is being specified using one of the other options, the
IV is generated from this password.
-md digest
Use the specified digest to create the key from the passphrase.
The default algorithm as of this writing is sha-256. But this
has changed over time. It was md5 in the past. So you might want
to specify this parameter every time to alleviate problems when
moving your encrypted data from one system to another or when
updating openssl to a newer version.
OpenSSLについて具体的に質問しましたが、この記事に基づく暗号化の目的で、代わりにGPGを使用することを検討してください。オフサイトバックアップの暗号化にはOpenSSLとGPGを使用しますか?
GPGを使用して同じことを行うには、次のコマンドを使用します。
暗号化するには:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
復号化するには:
gpg --output un_encrypted.data --decrypt encrypted.data
注:暗号化または復号化するときに、パスワードの入力を求められます。
gpg
パスワードの入力を求められることなくファイルを復号化できます。パスワードが一定期間保存されているようですが、これは望ましくありません。
--no-symkey-cache
gpgを--symmetric
で使用するとキャッシュが無効になるようです。
暗号化:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
復号化:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
詳細については、openssl(1)
ドキュメントを参照してください。
-k symmetrickey
と-pass stdin
か-pass 'pass:PASSWORD'
-k symmetrickey
誤解を招く可能性があることに注意してください。この-k
オプションは、OpenSSLが対称鍵を導出するパスワードを指定するために使用されます。対称鍵を指定する場合は、-K
オプションを使用する必要があります。
OPENSSLデフォルトのキー派生を使用しないでください。
現在受け入れられている回答はそれを利用しており、もはや推奨されておらず安全ではありません。
攻撃者がキーをブルートフォースすることは非常に現実的です。
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1は、MD2 [6]、MD5 [19]、またはSHA-1 [18]であるハッシュ関数を適用してキーを導出します。派生キーの長さは、ハッシュ関数出力の長さによって制限されます。これは、MD2およびMD5の場合は16オクテット、SHA-1の場合は20オクテットです。PBKDF1は、PKCS#5 v1.5の鍵導出プロセスと互換性があります。PBKDF1は、既存のアプリケーションとの互換性のためだけに使用することをお勧めします。これにより、PBKDF1が生成するキーは、アプリケーションによっては十分に大きくない場合があります。
PBKDF2は、疑似ランダム関数(例については付録B.1を参照)を適用してキーを導出します。派生キーの長さは基本的に無制限です。(ただし、派生キーの最大有効検索スペースは、基になる疑似ランダム関数の構造によって制限されることがあります。詳細については、付録B.1を参照してください。)PBKDF2は、新しいアプリケーションに推奨されます。
これを行う:
openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow
openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out
注:復号化の反復は、暗号化の反復と同じにする必要があります。
反復回数は10000以上にする必要があります。反復回数の良い答えは次のとおりです。https://security.stackexchange.com/a/3993
また、ここにはGPGを推奨する十分な人がいます。いまいましい質問を読んでください。
暗号化するには:
$ openssl bf < arquivo.txt > arquivo.txt.bf
復号化するには:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === CBCモードのBlowfish
ランダムに生成された公開鍵を使用して更新します。
暗号:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
復号化:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
これに関する完全なチュートリアルがhttp://bigthinkingapplied.com/key-based-encryption-using-openssl/にあります
OpenSSL CLIは、弱い非標準アルゴリズムを使用してパスフレーズをキーに変換し、GPGをインストールすると、ホームディレクトリに追加されたさまざまなファイルとgpg-agentバックグラウンドプロセスが実行されることに注意してください。最大の移植性と既存のツールによる制御が必要な場合は、PHPまたはPythonを使用して下位レベルのAPIにアクセスし、完全なAESキーとIVを直接渡すことができます。
Bashを介したPHP呼び出しの例:
IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456
ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED
これは出力します:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
PHPのopenssl_pbkdf2
関数を使用して、パスフレーズをキーに安全に変換することもできます。
私がオンラインで見つけたオープンソースプログラムがあり、opensslを使用してファイルを暗号化および復号化しています。単一のパスワードでこれを行います。このオープンソーススクリプトの優れた点は、元の暗号化されていないファイルを細断処理して削除することです。しかし、危険なのは、元の暗号化されていないファイルがなくなったら、パスワードを覚えていることを確認する必要があることです。
ここにリンクがgithubにあります
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
他の回答で述べたように、opensslの以前のバージョンでは、弱い鍵導出関数を使用して、パスワードからAES暗号鍵を導出していました。ただし、openssl v1.1.1は、より強力なキー派生関数をサポートしています。キーはpbkdf2
、ランダムに生成されたソルトを使用してパスワードから派生し、sha256ハッシュの複数の反復(デフォルトでは10,000)です。
ファイルを暗号化するには:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
ファイルを復号化するには:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
mti2935の良い答えに対する追加コメント。
イテレーションが高いほどブルートフォースに対する保護が向上するようです。パフォーマンス/リソースの面で余裕があるため、イテレーションを高くする必要があります。
私の古いIntel i3-7100では、かなり大きなファイル1.5GBを暗号化します:
time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,564s
time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,775s
実際には違いはありませんが、メモリ使用量はチェックしていません(?)
今日のGPUと明日はさらに速いので、毎秒10億回のブルートフォースの反復が可能だと思います。
12年前、a NVIDIA GeForce 8800 Ultra
は200,000百万/秒を超える反復を繰り返すことができました(ただしMD5ハッシュ)
PKCS5_PBKDF2_HMAC
。EVP_*
暗号化と復号化には関数を使用する必要があります。OpenSSL wikiのEVP対称暗号化および復号化を参照してください。実際、機密性と信頼性の両方を提供するため、おそらく認証された暗号化を使用する必要があります。OpenSSL wikiのEVP Authenticated Encryption and Decryptionを参照してください。