Beaglebone Blackベースのカスタムボードを使用しており、ファームウェアファイルの暗号化にハイブリッド暗号化を使用します。つまり、大きなファームウェアファイルの暗号化には対称、対称キーファイルの暗号化には非対称を使用します。ハイブリッド暗号化のアイデアについては、 this ブログを参照してください。
対称キーと非対称キー(主にBashスクリプト)の生成に関して、次の疑問があります。
方法1:
openssl Rand 128 > sym_keyfile.key
疑問1:
キーの長さはどうですか? 128、192、256は暗号化と復号化に影響しますか?暗号化と復号化に時間がかかるだけですか?
方法2:
cat /dev/urandom | head -n 128 > sym_keyfile.key
方法3:
cat /dev/random | head -n 128 > sym_keyfile.key
疑問2:
方法1と方法2のどちらがよりランダムな方法ですか?方法2は十分にランダムであると思う傾向があります。random, urandom
のマニュアルページでは、不明な場合に備えてurandom
の使用を提案しています。ただし、より安全な乱数を生成するのに十分なエントロピーがシードされています。
疑問3:
OpenSSLに/dev/urandom
から乱数を取得するよう依頼できますか?
秘密鍵の生成:
openssl genrsa -out keyfile.key 4096
秘密鍵からの公開鍵生成:
openssl rsa -in keyfile.key -pubout -out keyfile.pub
rsa
に関するOpenSSLヘルプを読むと、次のように書かれています。
RsaコマンドはRSA鍵を処理します。さまざまなフォームとそのコンポーネントを印刷して変換できます。このコマンドは、秘密鍵の暗号化に従来のSSLeay互換形式を使用していることに注意してください。新しいアプリケーションでは、pkcs8ユーティリティを使用してより安全なPKCS#8形式を使用する必要があります。
疑念4:
OpenSSLは、秘密鍵と公開鍵の両方を生成するため、または秘密鍵から公開鍵を生成するためだけにpkcs#8
を使用することを提案していますか?
疑問5:
より安全な非対称キーを生成する他の方法を提案しますか?
OpenSSLとLinuxカーネルでデフォルトで使用されているPRNG(疑似乱数ジェネレータ))の比較研究を求めているようです。これはおそらく、数式でいっぱいのボリュームを埋めることができます。さらに悪いことに、OpenSSLとLinux PRNGは独立していない OpenSSLはデフォルトのシードとして/ dev/urandomを使用するため) 、そして代替案を提供するための進行中の作業がありますPRNG Linuxの場合(主題についてのStephanMüllerの作業を見ることができます here および there = linuxカーネルのメーリングリストでの彼の議論).
ただし、ほとんどの場合、どちらも同じ長所と短所を共有します。
したがって、セキュリティに関して、ここでの主な関心事は、OpenSSLまたは/dev/urandom
のどちらを使用するかではなく(特に、前者が舞台裏で後者に依存していることがわかっている場合)、シードの品質を確保することです。特に、あなたがしたい必要なのは、TRNG(True Random Number Generator)の1つまたは複数のソースです。暗号化に適した予測不可能なランダムデータを提供するために特別に設計された一部のハードウェアコンポーネント。
これにより、上記のアルゴリズムで使用されるシードの品質が、システムI/O、負荷などの外部要因に依存しないことが保証されます(使用可能な場合、これらのエントロピーソースは引き続き使用される可能性が高いですが、 TRNG入力)。ほとんどの状況で、これは2つの十分に確立されたPRNG実装から選択するよりも、全体的なキーの強度に大きな影響を与えます。
今あなたの疑問に答えるために:
疑問1:
キーの長さはどうですか? 128、192、256は暗号化と復号化に影響しますか?暗号化と復号化に時間がかかるだけですか?
はい、そうです。鍵が大きいほど、暗号化と復号化に多くの計算能力が必要になります。これの背後にある考え方は、正しいキーを知っている正当なデバイスからのより多くの努力が必要になる一方で、潜在的な攻撃者からの「指数関数的に」より多くの努力が必要になるということです。
適切な長さについては、このウェブサイトでこの話題について多くの議論が見られます( この素敵なテーブルのように )。いくつかの一般的なケースといくつかの制約を考慮したもの(組み込みデバイスなど)非常に限られた計算能力)。
疑問2:
方法1と方法2のどちらがよりランダムな方法ですか?私は方法2は十分にランダムであると思う傾向があります。ランダム、urandomのマニュアルページでは、不明な場合はurandomを使用することをお勧めしています。ただし、より安全な乱数を生成するのに十分なエントロピーがシードされています。
方法3は、突然、不確定な時間の間ブロックする場合があります。これがあなたが望むものではない場合(そして通常はこれを望まない場合)、選択は確かに方法1と2の間です。
そこから、選択は単に個人的な好みの問題です。 OpenSSLを使用する構文は移植性が高く、簡単なので、head
コマンドのパラメーターとして-n
(バイト数)ではなく-c
(行数)を使用してバグを回避できます。 )))。
疑問3:
OpenSSLに/ dev/urandomから乱数を取得するように要求できますか?
これはデフォルトの動作ですが、このOpenSSLドキュメントがあなたの友人であることを確認したい場合は、-Rand
パラメータを追加することをお勧めします:
openssl Rand -Rand /dev/urandom 128 > sym_keyfile.key
疑念4:
OpenSSLは、秘密キーと公開キーの両方を生成するために、または秘密キーから公開キーを生成するためだけにpkcs#8を使用することを提案していますか?
LvBコメントで述べたように、これはキーがstoredであり、生成されない方法です(これは、.Zip
、.rar
または.tar.gz
アーカイブにファイルを格納するのと同じです)。
自由に選択できる場合は、OpenSSLは実際に、従来のSSLeay形式ではなく、最新の標準化された形式を使用することをお勧めします。
.p12
ファイルが暗号化されている場合、最初にファイルを解読しないとパブリック証明書も読み取れないことを意味します)。実際には、選択は多くの場合、キーを使用するアプリケーションでサポートされているものにまで及びます。そのドキュメントでは、多くの場合、キーマテリアルをどこにどのように保存するかを指示しています。
疑問5:
より安全な非対称キーを生成する他の方法を提案しますか?
上記のTRNGデバイスについてはすでに触れましたが、成熟したよく知られているソフトウェア実装を使用して、既知の土地に留まることもお勧めします。貧弱なアルゴリズムまたは優れたアルゴリズムを実装しているソフトウェアですが、バグのある実装を使用すると、セキュリティを同等に破壊できます。
そして最後に、 間違いはどこでも発生する可能性があります なので、常に最新情報を入手してください。しかし、それらは、エキゾチックなソリューションよりも確立されたソリューションですぐに検出および解決される可能性が最も高くなります。
ハイブリッド暗号化を自分で実装するのではなく、openssl smime
サブコマンドを使用することをお勧めします。もう1つのオプションは、gpg
を使用することです。これは、ファイルの署名と暗号化にopensslよりはるかに適しています。
openssl smime
とgpg
は両方とも自動的にハイブリッド暗号化を行います。