web-dev-qa-db-ja.com

ソフトウェアで機密データを暗号化し、サーバーに保存/復号化する

ITセキュリティとGoogleでこれに似たものを検索しましたが、自分のやっていることに関連するものをリモートで見つけることができませんでした。

私は2つの部分からなるソフトウェアを開発しています-1つの安全な信頼できるコンピューターで実行されるC#プログラムと、サーバーで実行されるPHPソフトウェア)。このシステムは、機密データ、つまり薬局のレコードを扱います(米国ではない [〜#〜] hippaa [〜#〜] は適用されません)。

データを安全に暗号化して、データベースが盗まれた場合でも、可能な限りデータを復号化できないようにしたいと考えています。名前、住所などの識別可能なデータを保存せずにデータを保護しています。

最初は このソリューション のバリアントを使用したかったのですが、さらに熟考すると、RSAはプレーンテキストを直接暗号化する適切な方法ではないことに気付きました。私の研究により、AESがそのための最も適切なアルゴリズムであると私は信じるようになりました。暗号化の専門家でないほとんどの人に与えられたアドバイスは業界標準のプロトコルに従うことですが、私の基準に一致するプロトコルを見つけることができませんでした。

基準は次のとおりです。

  • 各ユーザーのデータについて、サーバーのコンテンツが与えられた場合、ユーザー自身のみが数学的にデータにアクセスできる必要があります。つまり、パスワードから派生したキーが使用されます(C#ソフトウェアはすべてのユーザーのデータにフルアクセスでき、アクセスできます)キーに)
  • サーバーのコンテンツのみを取得した場合、復号化は不可能であるべきです
  • プレーンテキストデータはサーバーに保存しないでください(したがって、C#ソフトウェアで暗号化したい)
  • ユーザーがパスワードを入力できるようにすることなく、データを暗号化できる必要がある
  • データは解読され、PHPで読み込まれます-新しいデータや変更されたデータを再暗号化して書き込む必要はありません
  • ユーザーのパスワードのハッシュのみを保存またはアクセスできます

これが私が思いついた解決策です:

当然、すべての接続はTLS/SSL(HTTPS経由)を介して行われます。機密データが転送される前に、サーバーとソフトウェアが「準備」またはペアリングされます。サーバーで非対称キーペアが生成され、秘密キーがソフトウェアに転送されます(C#コンポーネントを「ソフトウェア」と呼びます)。秘密鍵がサーバーから削除され、公開鍵が保管されます。

ユーザーが登録すると、そのパスワードが使用され、PBKDF2を使用して128ビットのキーが生成されます。このキーは、以前に生成された公開キーを使用してRSAで暗号化され、保存されます。

ソフトウェアからサーバーにデータがアップロードされると(24時間ごと)、ソフトウェアは(当然HTTPSを介して)データをアップロードするユーザーIDのリストを送信します。サーバーは、RSAで暗号化された128ビットの鍵のリストを、対応するユーザーIDとともに返信します。ソフトウェアは、プライベートキーを使用して1つずつ暗号化を解除し、128ビットキーのリストを取得します。サーバーはユーザーごとに、そのユーザーのデータを取得し、そのユーザーの対応するキーを使用してAES-128で暗号化します。ペイロード全体がサーバーにアップロードされ、直接格納されます。

ユーザーがログインすると、パスワードに短時間アクセスでき、PBKDF2を使用してAES-128キーが生成されます。ユーザーがページをロードするたびにパスワードを再入力する必要がないように、AES-128キーは短い(5〜10分)有効期限でマシンの安全なCookieに保存され、後続のページロードで復号化して表示するために使用されます。そのユーザーのデータ。実際には、サーバーに実際に保存されることはありません。

このセキュリティプロトコルは適切ですか?変更する必要がありますか?業界標準でここで機能するものはありますか?どんな助けでも大歓迎です。

8
Matt Jadczak

独自のプロトコルを展開することはhardです。あなたは多かれ少なかれ実行するものを簡単に手に入れますが、安全なものを手に入れるには多くの作業とかなりの量の運も必要とします。

要件から、次のようなプロトコルが必要です。

  • 各ユーザーは、暗号化に適した非対称キーペアを持っています(たとえば、RSAまたはElGamal)。
  • 秘密鍵Kプライベートは、ユーザーパスワードから導出された対称キー[〜#〜] k [〜#〜]で暗号化され、その後、サーバーに保存されます。
  • 公開鍵Kパブは暗号化なしでサーバーに保存されます(これはpublicです)。
  • データ要素はKで暗号化されますパブ。だれでも公開鍵を使用して暗号化することができます(これが公開鍵の公開の要点です)。
  • データを復号化するために、ユーザーは自分のパスワードを入力します。これは再計算に使用されます[〜#〜] k [〜#〜]、次にblobを復号化しますKを含むプライベート。その非対称秘密鍵を使用すると、ユーザーは対応する公開鍵で暗号化されたすべてのデータファイルを復号化できます。

OpenPGP形式 には、そのために必要なすべてのプリミティブが含まれています。 BouncyCastle は、その形式を使用できるオープンソースライブラリであり、C#/。NETバージョンとして使用できます。

5
Thomas Pornin