セキュリティの分野ではあまり経験がありませんが、オフラインになる一部のマシンでソフトウェアの更新に対処するために、大きなフォルダーに署名してから暗号化しようとしています。私は、会社が秘密にして、各マシンに展開する一般的なキーペアについて考えました。キーペアを生成するために、次のコマンドを使用しました。
openssl genrsa -des3 -out private.pem 2048
次に:
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
ここで、1つのフォルダーをZipするために1つのスクリプトを作成し、ランダムなパスワードを使用してaes-256対称暗号化を使用し、新しく生成されたキーを使用してパスワードに署名および暗号化します。
#!/bin/bash
Zip update.Zip update/*
#Generate a random password
openssl Rand -hex 16 > symmetric_keyfile.key
#Encrypt the file with the random password
openssl aes-256-cbc -a -salt -k symmetric_keyfile.key -in update.Zip -out update.Zip.enc
rm update.Zip
#Sign the password with the private key
echo 'Signing...'
openssl rsautl -sign -inkey private.pem -in symmetric_keyfile.key -out symmetric_keyfile.key.sign
#Encrypt the password with the public key
echo 'Encrypting...'
openssl rsautl -encrypt -inkey public.pem -pubin -in symmetric_keyfile.key.sign -out symmetric_keyfile.key.enc
#Zip both files
Zip update.Zip symmetric_keyfile.key.enc update.Zip.enc
ただし、暗号化中にこのエラーが発生しました:
adding: update/deploy.Zip (stored 0%)
Signing...
Enter pass phrase for private.pem:
Encrypting...
RSA operation error
140035711579800:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:153:
これは、署名されたキーが暗号化するには大きすぎることに関連していると思います。サイズは256バイトです。何か案は?
このコメント に基づいて、2048ビットのRSA鍵を使用して最大214バイトを暗号化できます。
実行したのと同じ操作を実行すると、次の結果が得られます。
$ ls -lah
total 44K
drwxr-xr-x 3 my_user my_user 4.0K Sep 27 10:50 .
drwxrwxrwt 20 root root 4.0K Sep 27 10:49 ..
-rw-r--r-- 1 my_user my_user 658 Sep 27 10:49 pouet.sh
-rw------- 1 my_user my_user 1.8K Sep 27 10:49 private.pem
-rw-r--r-- 1 my_user my_user 451 Sep 27 10:50 public.pem
-rw-r--r-- 1 my_user my_user 33 Sep 27 10:50 symmetric_keyfile.key
-rw-r--r-- 1 my_user my_user 0 Sep 27 10:50 symmetric_keyfile.key.enc
-rw-r--r-- 1 my_user my_user 256 Sep 27 10:50 symmetric_keyfile.key.sign
drwxr-xr-x 9 my_user my_user 4.0K Sep 27 10:49 update
-rw-r--r-- 1 my_user my_user 3.5K Sep 27 10:50 update.Zip
-rw-r--r-- 1 my_user my_user 4.2K Sep 27 10:50 update.Zip.enc
暗号化しようとしているのでsymmetric_keyfile.key.sign
は256バイトです。失敗はごく普通のことです。暗号に関する私のスキルが低いので、暗号化する前に鍵に署名しないことをお勧めします。私の意見では、このステップは無意味です...
AESキー自体に署名しようとしたときの署名の概念を誤解したと思います。前にdgstツールで暗号化するファイル全体に署名するようにスクリプトを変更しました。
#!/bin/bash
Zip update.Zip update/*
#Hash and sign with the private key
echo 'Signing...'
openssl dgst -sha256 -sign private.pem -out update.Zip.sha update.Zip
#Generate a random password
openssl Rand -hex 16 > symmetric_keyfile.key
#Encrypt the file with the random password
openssl aes-256-cbc -a -salt -k symmetric_keyfile.key -in update.Zip -out update.Zip.enc
rm update.Zip
#Encrypt the password with the public key
echo 'Encrypting...'
openssl rsautl -encrypt -inkey public.pem -pubin -in symmetric_keyfile.key -out symmetric_keyfile.key.enc
#Zip all the files
Zip update.Zip symmetric_keyfile.key.enc update.Zip.enc update.Zip.sha
暗号化/署名チェーンをまとめるためにopenssl
プリミティブを使用しています。
これは、独自の暗号化を実装するためのほんの小さなステップです。
署名と暗号化にopenssl
を使用する代わりに、実際にそうするように設計された確立されたツールの使用を検討してくださいsecurely。
これは、GnuPG(対称暗号化を使用しますが、非対称暗号化にも適用できます)を使用して、私が使用しているスクリプトからわずかに変更して、同様のことを行う方法の例です。
ENCRYPTIONKEY=$(openssl Rand -hex 32)
tar cfj - update/* | \
gpg -c --batch --yes -z 0 --cipher-algo AES256 -o update.tar.bz2.gpg \
--passphrase-fd 9s 9< <(printf '%s' "$ENCRYPTIONKEY") -
(また、AES-256に対して128ビットではなく256ビットのセキュリティを確保するために、16ではなく32桁の16進数をパスフレーズに使用したことにも注意してください。)
上記は、ランダムに生成されたパスフレーズを使用して、対称的に暗号化されたOpenPGPファイルを作成します。暗号化されたファイル自体は、圧縮されたtar
アーカイブで構成されます。パスフレーズを個別に送信する必要があります。パスフレーズは非対称暗号化ファイルとして保存される可能性があります。何かのようなもの:
printf '%s\n' "$ENCRYPTIONKEY" | \
gpg --output update.tar.bz2.pass.gpg --encrypt --sign --recipient $rcptkeyid \
--passphrase-fd 9s 9< <(printf '%s' "$SIGNPASS")
Zip -0 update.Zip update.tar.bz2.gpg update.tar.bz2.pass.gpg
上記はすべての敵に対して安全であることが保証されているわけではありませんが、暗号プリミティブのみを使用して独自に作成したものよりも優れているはずです(生のRSAを使用することによる固有のサイズ制限はありません)。また、ペイロードデータの暗号化に使用される実際のパスフレーズ(暗号化されていないスワップが存在しない可能性があります)がいかなる種類の永続ストレージにも決して書き込まれないという副次的な利点もあります。また、テストされていないため、適切に動作するように微調整が必要になる場合があります。
暗号化されているかどうかに関係なく、大きなファイルで使用できる別のオプションは、ファイルのsha/blakeハッシュを生成してから、生成されたハッシュの署名を生成することです。