web-dev-qa-db-ja.com

SSH -priv-keyでのみファイルを暗号化しますか?

SSH秘密鍵のパスワードを知って、自分だけが読めるようにファイルを暗号化したいとします。機密情報を暗号化または難読化するリポジトリを共有しています。つまり、レポには情報が含まれますが、特別な場合にのみそれを開きます。

  1. SSH-agentを使用している場合、後で自分だけがファイルを暗号化する簡単な方法はありますか?

  2. これにGPGを使用する理由がわかりません。質問 here ;基本的にはパスワードがわかっているので、SSHキーと同じパスワードでのみファイルを復号化したいと思います。これは可能ですか?

22
user2362

あなたの要件は有効だと思いますが、対称暗号と非対称暗号を混在させているため、それも難しいです。私が間違っていたら訂正してください。

推論:

  1. 秘密鍵のパスフレーズは、秘密鍵のみを保護することです。
  2. これにより、次の状況が発生します。秘密鍵を使用して、自分だけが解読できるものを暗号化したい。あなたの秘密鍵はそのためのものではなく、あなたの公開鍵がそれを行うためのものです。秘密鍵で暗号化したものはすべて公開鍵(署名)で復号化できますが、それは確かに望んでいることではありません。 (公開鍵で暗号化されたものはすべて、秘密鍵でのみ復号化できます。)
  3. したがって、データを暗号化するには公開鍵を使用する必要がありますが、そのためには、そのための秘密鍵のパスフレーズは必要ありません。それを復号化したい場合のみ、秘密鍵とパスフレーズが必要になります。

結論:基本的に、対称暗号化にパスフレーズを再利用したいとします。パスフレーズを指定したい唯一のプログラムはssh-agentであり、このプログラムはパスフレーズだけで暗号化/復号化を行いません。パスフレーズは、秘密鍵のロックを解除して忘れた場合にのみ存在します。

推奨:暗号化には、パスフレーズで保護されたキーファイルでopenssl encまたはgpg -e --symmetricを使用します。情報を共有する必要がある場合は、両方のプログラムの公開鍵インフラストラクチャを使用して、PKI/Web of Trustを作成できます。

Opensslでは、次のようになります。

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 

そして復号化のようなもの

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf

更新:上記のopensslコマンドはデータの改ざんを防止しないことに注意することが重要です。 encファイルを単純にビットフリップすると、復号化されたデータも破損します。上記のコマンドではこれを検出できません。たとえば、SHA-256などの適切なチェックサムでこれを確認する必要があります。これを統合的に行う暗号化の方法があり、これはHMAC(ハッシュベースのメッセージ認証コード)と呼ばれます。

27
vasquez

どこにでもあるようなopensslユーティリティを使用したいと思います。

RSA公開鍵と秘密鍵をPEM形式に変換します。

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

公開鍵でファイルを暗号化する:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc

秘密鍵でファイルを復号化する:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt

しかし、Gillesが上記でコメントしたように、これは公開鍵よりも小さいファイルの暗号化にのみ適しているため、次のようなことができます:

パスワードを生成し、対称的にファイルを暗号化し、公開でパスワードを暗号化して、ファイルにキーを保存します。

$ openssl Rand 64 | 
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

秘密鍵でパスフレーズを復号化し、それを使用してファイルを復号化します。

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | 
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

暗号化されたファイルと暗号化されたパスフレーズの2つのファイルが作成されますが、スクリプトに入れるとうまく機能します。

tar cvf file file.enc file.enc.key片付けます。

最適には、パスフレーズのサイズを最大化し、Rand 64を公開鍵のサイズに変更します。

21
kwarrick

luks/dm-cryptを見てください。適切なオプションを使用して、ssh-private-keyを暗号化キーとして使用できます。

更新:LV-block-deviceでLUKSを使用した暗号化の例(VGシステムでのLVテスト):

KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY

これにより、ブロックデバイス/ dev/mapper/test_cryptを使用してデータを保存できます(選択したファイルシステムでフォーマットした後)。

それを取り除くには、アンマウントし、cryptsetup luksClose test_cryptを使用します。

6
Nils