web-dev-qa-db-ja.com

公開鍵暗号化は正しい選択ですか?

注:これを元々暗号スタック交換に投稿しましたが、代わりにここで指摘されました

機密データの暗号化を必要とするプロジェクトに取り組んでおり、モバイルアプリとWebサイトの間で(APIを介して)データを通信します。

暗号化とセキュリティは初めてですが、私の現在の考えは次のとおりです。

  • データは常にアプリに入力され、Webサイト経由で表示されます。したがって、情報を表示するだけでよいため、Webサイトのユーザーのみが公開鍵と秘密鍵を必要とします(ハイブリッドを使用できますが、メッセージは短くなります)。
  • 情報の表示を許可された正しいユーザーの公開鍵を使用して、データサーバー側を暗号化する
  • 暗号化されたデータはデータベースに保存されます
  • キーはサーバーに保存されます(アクセス制御の点でこれがどのように機能するかは不明です)

Webサイトの他のユーザーは、自分が表示することを許可されたデータしか見ることができないことが重要です。つまり、公開鍵と秘密鍵の暗号化です。明らかに、ここでデータベースにクエリを実行するのは難しいかもしれませんが、IDやその他の識別できない情報を使用すると、より簡単になります。

これは現実的な考えですか、それとも暗号化の動作に関して完全に間違っていますか?私は完全に初心者なので、キー管理などについてはあまり知りません。

4
Vanita

各ユーザーの公開鍵/秘密鍵の生成について話している。それはやり過ぎです。代わりに、アプリとサーバー間の通信に、TLS 1.2以降で署名済みのSSL証明書を使用していることを確認してください。プロセスをよりよく理解するには、 SSL/TLSの仕組み を読んでください。

データを分離しておくために、セッションのようなものが出てきます(ほとんどの主要なWebプログラミング言語は、ある種のセッション管理をサポートしています)。セッションはサーバーエンドにデータを保存し、ユーザーにランダムなハッシュを与えます。セッション中毒(私が誰か他の人のハッシュを取得する)の可能性は常にありますが、確率は一般的に低いです。それらは公開鍵/秘密鍵を交換しようとすることよりも高くありません(データを送信する前に行う必要があります)。

セッションを取得すると、ユーザーIDのようなものを内部に格納できます(ユーザーはこれに直接アクセスできず、表示されることもありません)。次に、ユーザーがレコードを要求すると、そのユーザーがそのレコードへのアクセスを許可されているかどうかを確認し、それに応じて許可/拒否します。

3
Machavity

@machavityの回答で述べたように、ここで各ユーザーの公開秘密鍵を使用することは良い解決策ではありません。

  • データは常にアプリに入力され、Webサイト経由で表示されます。したがって、情報を表示するだけでよいため、Webサイトのユーザーのみが公開鍵と秘密鍵を必要とします(ハイブリッドを使用できますが、メッセージは短くなります)。
  • 情報の表示を許可された正しいユーザーの公開鍵を使用して、データサーバー側を暗号化する

ユーザーが互いにデータを共有したい場合はどうなりますか?

  • 暗号化されたデータはデータベースに保存されます

ユーザーに対して個別にクエリを実行できますが、複数のユーザーのデータに対していくつかのクエリを実行する場合はどうでしょうか。パターンやものを見つけようとする

考慮すべき点は次のとおりです。

  • ユーザーにアプリとウェブサイトの両方でアカウントを作成してもらいます。このようにして、各ユーザーの一意のIDを取得します
  • アクセス制御メカニズムを使用して、特定のIDがアクセス権のあるデータのみにアクセスできるようにします。
  • データの機密性を考慮して、アプリとWebサイトの間にTLS通信を実装します。
  • データはそのままデータベースに残します。もちろんパスワードを除いて!
2
Limit

(私はあなたがしなければならないHTTPSで接続をすでに暗号化していると仮定しています。)

データベース内のデータは暗号化しないでおくことが一般的です。これは、データベースをバッチ形式でクエリできるようにするために必要です。 (つまり、特定の郵便番号の全員を確認したり、特定のメールアドレスを持っている人や、どのユーザー名が使用されているかなどを確認したりします。)アクセス制御はどちらの方法でも可能です。

バッチ形式でのクエリが不要な場合は(メッセージの内容など)、暗号化は優れたセキュリティ機能です。これは通常、サーバーが侵害された場合の第2の防御線です。

保存された暗号化の1つの問題は、暗号化キーを保存する方法です。クライアントアプリケーションが、キーファイルを管理するのに十分なほどスマートで信頼性がない場合は、サーバーに保存する必要があります。しかし、サーバーにキーと暗号化されたデータを保存すると、ハッカーは理論的には両方に到達する可能性があります。

(もちろん、ユーザーのログインパスワードは暗号化せずにハッシュ化する必要があります。)

これらの問題があっても、他の欠陥のためにサーバーが危険にさらされている場合に備えて、他のサービスへのパスワード、SSN、超機密文書などの特別な機密情報を暗号化する必要があります。

(クレジットカード番号も暗号化されますが、PCI DSS問題を回避するには、処理ゲートウェイにアウトソーシングします。)

1つのオプションは、単一のマスター暗号化キーを用意し、それをデータベースの外部に格納することです。これにより、ハッカーがSQLiを使用してデータベース内の暗号化されたデータにアクセスした場合でも、データベースの外部にあるため、キーにアクセスできません。ただし、SQLi以外の違反については、おそらくキーファイルを簡単に見つけることができます。

野心的であると感じている場合は、 このようにユーザーのパスワードからキーを取得できます 。ただし、これは自動パスワードリセット機能と互換性がない可能性があります。

しかし、先ほど述べたように、データを暗号化しないでおく方が一般的です。特に、データの機密性が高すぎない場合、またはデータベースバッチクエリを使用してすべてにアクセスする必要がある場合。

1
Bryan Field