注:これを元々暗号スタック交換に投稿しましたが、代わりにここで指摘されました
機密データの暗号化を必要とするプロジェクトに取り組んでおり、モバイルアプリとWebサイトの間で(APIを介して)データを通信します。
暗号化とセキュリティは初めてですが、私の現在の考えは次のとおりです。
Webサイトの他のユーザーは、自分が表示することを許可されたデータしか見ることができないことが重要です。つまり、公開鍵と秘密鍵の暗号化です。明らかに、ここでデータベースにクエリを実行するのは難しいかもしれませんが、IDやその他の識別できない情報を使用すると、より簡単になります。
これは現実的な考えですか、それとも暗号化の動作に関して完全に間違っていますか?私は完全に初心者なので、キー管理などについてはあまり知りません。
各ユーザーの公開鍵/秘密鍵の生成について話している。それはやり過ぎです。代わりに、アプリとサーバー間の通信に、TLS 1.2以降で署名済みのSSL証明書を使用していることを確認してください。プロセスをよりよく理解するには、 SSL/TLSの仕組み を読んでください。
データを分離しておくために、セッションのようなものが出てきます(ほとんどの主要なWebプログラミング言語は、ある種のセッション管理をサポートしています)。セッションはサーバーエンドにデータを保存し、ユーザーにランダムなハッシュを与えます。セッション中毒(私が誰か他の人のハッシュを取得する)の可能性は常にありますが、確率は一般的に低いです。それらは公開鍵/秘密鍵を交換しようとすることよりも高くありません(データを送信する前に行う必要があります)。
セッションを取得すると、ユーザーIDのようなものを内部に格納できます(ユーザーはこれに直接アクセスできず、表示されることもありません)。次に、ユーザーがレコードを要求すると、そのユーザーがそのレコードへのアクセスを許可されているかどうかを確認し、それに応じて許可/拒否します。
@machavityの回答で述べたように、ここで各ユーザーの公開秘密鍵を使用することは良い解決策ではありません。
- データは常にアプリに入力され、Webサイト経由で表示されます。したがって、情報を表示するだけでよいため、Webサイトのユーザーのみが公開鍵と秘密鍵を必要とします(ハイブリッドを使用できますが、メッセージは短くなります)。
- 情報の表示を許可された正しいユーザーの公開鍵を使用して、データサーバー側を暗号化する
ユーザーが互いにデータを共有したい場合はどうなりますか?
- 暗号化されたデータはデータベースに保存されます
ユーザーに対して個別にクエリを実行できますが、複数のユーザーのデータに対していくつかのクエリを実行する場合はどうでしょうか。パターンやものを見つけようとする
考慮すべき点は次のとおりです。
(私はあなたがしなければならないHTTPSで接続をすでに暗号化していると仮定しています。)
データベース内のデータは暗号化しないでおくことが一般的です。これは、データベースをバッチ形式でクエリできるようにするために必要です。 (つまり、特定の郵便番号の全員を確認したり、特定のメールアドレスを持っている人や、どのユーザー名が使用されているかなどを確認したりします。)アクセス制御はどちらの方法でも可能です。
バッチ形式でのクエリが不要な場合は(メッセージの内容など)、暗号化は優れたセキュリティ機能です。これは通常、サーバーが侵害された場合の第2の防御線です。
保存された暗号化の1つの問題は、暗号化キーを保存する方法です。クライアントアプリケーションが、キーファイルを管理するのに十分なほどスマートで信頼性がない場合は、サーバーに保存する必要があります。しかし、サーバーにキーと暗号化されたデータを保存すると、ハッカーは理論的には両方に到達する可能性があります。
(もちろん、ユーザーのログインパスワードは暗号化せずにハッシュ化する必要があります。)
これらの問題があっても、他の欠陥のためにサーバーが危険にさらされている場合に備えて、他のサービスへのパスワード、SSN、超機密文書などの特別な機密情報を暗号化する必要があります。
(クレジットカード番号も暗号化されますが、PCI DSS問題を回避するには、処理ゲートウェイにアウトソーシングします。)
1つのオプションは、単一のマスター暗号化キーを用意し、それをデータベースの外部に格納することです。これにより、ハッカーがSQLiを使用してデータベース内の暗号化されたデータにアクセスした場合でも、データベースの外部にあるため、キーにアクセスできません。ただし、SQLi以外の違反については、おそらくキーファイルを簡単に見つけることができます。
野心的であると感じている場合は、 このようにユーザーのパスワードからキーを取得できます 。ただし、これは自動パスワードリセット機能と互換性がない可能性があります。
しかし、先ほど述べたように、データを暗号化しないでおく方が一般的です。特に、データの機密性が高すぎない場合、またはデータベースバッチクエリを使用してすべてにアクセスする必要がある場合。