web-dev-qa-db-ja.com

秘密鍵を安全に送信する方法

秘密鍵とSSL秘密鍵を送信するための推奨される方法とベストプラクティスは何ですか?私はファイルを圧縮して、それからgpgを使用することを考えていました:

gpg -c thefile.Zip

問題は、暗号化に使用されたパスフレーズを相手側にどのように送信するかということになります。より良い解決策はありますか?

46
Justin

TL; DR:秘密鍵は、理由により秘密と呼ばれます。


秘密鍵はまったく送信しないで保護できます。

  • それらが使用されているサーバーへのシェルアクセス権がある場合は、それらを生成するだけですin situ
  • ターゲットデバイスが弱すぎて電力が不足してキーを生成できない場合は、非対称暗号化を使用するには弱すぎます(これにはエントロピーソースが含まれます)。もちろん、メモリに制約のあるハードワイヤードデバイス(スマートカードなど)もありますが、物理的に安全なリンクを使用して、インターネットに接続していなくてもキーをデバイスに移動できます。かなりあいまいなコーナーケースは、リモートデバイス(読み取り:宇宙探査機または衛星)で使用される非対称暗号化ですが、条件が実際に満たされることはほとんどありません(1つのキーが危険にさらされていますが、別の安全なリンクはまだ利用可能です)。
  • ターゲットデバイスへのセキュアシェルアクセス(SSH)がない場合、通常、ファイルを安全にコピー(SCP)できません。暗号化された形式であっても、メールを使用してキーを移動すると、メッセージに不当な注意が向けられ、おそらくインターネット上の何十もの場所に証跡が残ります。
  • キーを送信するということは、チャネルの反対側にいる人々がmustあなたを信頼し、あなたmustそれらを信頼することを意味します。これは、ビジネスやその他のハイステークス環境では常に良い提案とは限りません(どちらの当事者も秘密鍵を手にして通信を偽造することができます)。

編集:ホスティングプロバイダーのプライベートキーの前述の使用例については、適切な場所で生成することをお勧めします。

61
Deer Hunter

GPGでは、パスフレーズを送信しなくても、これらを安全に送信できます。宛先に独自のGPGキーがある場合は、ファイルを暗号化して、そのユーザーだけがファイルを開くことができるようにすることができます。たとえば、gpg -e -r E9053BDA thefile.Zipを使用すると、パスフレーズを通信することなく、自分だけが自分のGPGキーでthefile.Zipを開くことができます。または、gpg-Zip -e -r E9053BDA *.crtは、すべての*.crtファイルを1つのコマンドで圧縮および暗号化します。

ドキュメントリファレンス:

21
akraut

安全な方法(または暗号化に使用したすべてのキー/パスフレーズ)で秘密にキーを送信するには、最初から事前に確立された信頼できる安全なチャネルを使用するしかありません。

あなたのニーズと利用可能な可能性に応じて、これは含まれる可能性があります

  • openPGPでもS/MIMEでも、信頼できる公開鍵をすでに持っているアドレスに暗号化メールを送信する
  • (カタツムリ)メールを使用して送信し、必要に応じて封印する
  • 個人の旅行、必要に応じて公式IDを比較
  • sSHなどを使用して、信頼できるマシンへの安全なアップロード
  • 暗号化されたメールを送信する一方で、別のチャネル(電話、テキストメッセージ)を介してパスフレーズを送信する

実際にどの方法を使用するかは、ニーズと潜在的な盗聴者に完全に依存します。政府機関や秘密機関が潜在的な攻撃者である場合、それらの方法のほとんどは最初から危険にさらされます。電話も、カタツムリのメールも、もはや安全ではなくなります。

他の誰かと通信したいだけの場合、両端でtheir own鍵ペアを生成し、秘密鍵を秘密に保ちながら公開鍵を配布する必要があります。上記のように、事前に確立された信頼できるチャネルを介して、公開鍵に関する情報(指紋など)を交換する必要があります。

10
Jens Erat

まず、ディアハンターが上に書いたものを読んでください。秘密鍵を安全に送信する最善の方法は、最初から秘密鍵を送信しないことです。フルストップ。

そうは言っても、おそらくあなたの手とある場所にある秘密鍵を別の場所にある他の誰かの手に正当に転送する必要があるかもしれないいくつかの状況があります。 できる限りこれらの時間を最小限に抑える必要があります。できれば、それらを必要とするクライアントに、キー自体を生成するようにウォークするだけです。しかし、それが何らかの理由(または、より可能性が高い)で実用的ではない場合があり、それがあなたの呼び出しではない場合があります。それで、あなたはその後何をしますか?

非常に機密性の高い暗号化キー(非対称の秘密キーではなく対称またはワンタイムパッドのキー配布シナリオの場合が最も多い)をリモートの場所に配布する必要があるときに、政府やテクノロジー企業が行うことを実行します。 :

(1。) 1回の転送に対してのみ作成され、その後破棄される一意の「外部」キーを使用して、転送されるキーの地獄を暗号化してから、施設を離れる前に転送します。その保護暗号化キーがパスワードまたはパスフレーズから生成される場合、パスワードまたはフレーズは非常に高い強度の要件を満たします。

(2。)既存の汎用ネットワークよりもはるかにセキュリティの高いチャネルを使用してください-インターネットとも呼ばれます!- -暗号化されたパッケージを宛先に取得します。暗号化されたキーを含むメモリデバイスの物理的な配信は、最も単純ですが、必ずしも最も実用的なチャネルではありません。

(3。)保護用の暗号化を解除する「外部」キー(またはキーの基礎を形成するパスワード/パスフレーズ)を、必要なキーを転送する時まで保持しますそれらを転送し、クライアントの場所で復号化します。つまり、保護された暗号化を解読するために直接鍵転送イベントにいる、または別の独立した高セキュリティの電子チャネルを使用して保護用暗号化を解除する鍵を送信して、解読時にクライアントの場所にそれを送ります。

(#3にスキップして、セキュリティが最も高い電子チャネルでクライアントに移動する必要がある元の秘密鍵を送信するだけではありませんか?私たちは、1つのチャネルを信頼していません。優れたセキュリティ、秘密鍵のような情報を処理するのにほぼ十分です私たちは、対戦相手が少なくとも2つのチャネル/メカニズムの転送を傍受できるようにし、それを作成しますどちらか一方はもちろん、どちらか一方から何か有用なものを傍受することは困難です。

今、それはすべて困難で複雑に聞こえます。しかし、実際には必ずしもそうである必要はまったくありません。 (私たちが共通していると仮定すると、このキーは重要ですが、それは深刻ではありません。状況が悪化した場合。)たとえば、次のことができます。

-評判の高いハードウェア暗号化で保護されたUSBデバイスを使用してください。それに秘密鍵を書き、ユニークな強力なパスワード/コード/フレーズでそれをロックして、街中の鍵を必要とするクライアントの場所にそれを運転します。そこに着いたら差し込み、ロックを解除して、秘密鍵をクライアントのシステムにコピーします。

-新しい(以前は使用されていなかった)通常のUSBスティックをつかみます。信頼性の高いソフトウェアプログラムを使用して、ファイル内の秘密キーを暗号化します。ファイルをUSBに転送します。次に、USBを再確認します-念のために-暗号化されているパッケージがUSBのみであることを確認します。書留またはFedExを実行して、クライアントのサイトに送信します。到着したら、オフレコまたは類似のセキュリティメッセージングアプリを使用して、保護用の暗号化(または再生成に必要なパスワード/フレーズ)をクライアントに伝え、クライアントが秘密鍵を復号化して取得します。 。

-オンデマンドで電子的にクライアントに繰り返しキーを配布できるようにする必要がありますか?最後の例のようにファイル内の秘密鍵を暗号化します。暗号化されたキーファイルの配布にのみ使用し、クライアントにログインするための事前共有認証情報があり、通常はリモートアクセスから切断されたままである、シンプルだが安全なVPNまたはSSHアクセスサーバーを用意します。クライアントがあなたに電話して、キーを受け取る準備ができたことを伝えたら、それを内部ストレージ環境からサーバーに転送します。クライアントのIPアドレスからサーバーへのリモート接続を有効にします。クライアントが接続し、暗号化されたキーファイルを取得します。最後に、高セキュリティのメッセージングアプリ(またはその他)を使用して、保護キーをクライアントに転送します。

たくさんのオプション。転送のセキュリティを確保したい場合、それぞれにいくつかの作業が伴うのは事実です。仕事をする見込みがあるので辞めましたか?それは理解できます。その場合は、ポイント#1(ディアハンターが作成した元のポイント)を参照してください。秘密鍵をまったく転送する必要がない技術的な取り決めを作成します。

4
mostlyinformed

安全でないチャネルでこれを行う適切な方法は、公開鍵インフラストラクチャを使用して秘密鍵を送信することです。

1)受信側が公開鍵/秘密鍵のペアを生成します。

2)次に、送信側は受信側の公開鍵を使用して秘密鍵を暗号化し、送信します。この暗号化は、受信者だけが知っている受信者の秘密鍵によってのみ復号化できます。このようにして、秘密鍵を安全でない方法で安全な方法で送信できます。

考慮すべきことはこれだけではありません。受信者は送信者の身元をどのように確認できますか?これを行うには、送信者も秘密鍵と公開鍵のペアを生成する必要があります。

送信者は、「秘密キー」を受信者の公開キーで暗号化した後、送信前に最終的なメッセージを生成するために結果を自分の秘密キーで暗号化する必要があります。メッセージを受信した後、受信者はまず送信者の公開鍵でメッセージを復号化する必要があります。成功した場合、彼はメッセージが本物であることを保証できます。

Kを秘密鍵とする必要があります。Eは暗号化、Dは復号化です。

送信者:メッセージM = E(E(K、pub-k-receiver)、pri-k-sender)

受信者:K = D(D(M、pub-k-sender)、pri-k-receiver)

これで、受信者はメッセージが新しいかどうか、つまり、第三者が傍受して後で再生するような古いデータがないかどうかを心配する必要があります。通常、この問題を解決するために、メッセージMにタイムスタンプが埋め込まれています。

送信者:メッセージM = E(E(K +タイムスタンプ、pub-k-receiver)、pri-k-sender)

受信者:K = D(D(M、pub-k-sender)、pri-k-receiver)-タイムスタンプ

1
alex

通常は秘密鍵を送信するべきではありませんが、絶対に秘密鍵を送信する必要がある場合は、受信者の公開鍵で暗号化してください。受信者は、秘密鍵のコピーを保持できるというリスクを冒すことをいとわない必要があることに注意してください。

0
Micheal Johnson