はじめに
私は現在、VisualFox Pro データベースからデータ (薬局の記録) を毎日抽出し、その一部を WordPress サイトにアップロードして、薬局のクライアントが安全に閲覧できるようにするプロジェクトに取り組んでいます。私のソフトウェアの一般的な方法論に関してアドバイスをお願いします。コーディングはできますが、正しい方法で行っているかどうかを知る必要があります。PC ソフトウェア (C#/.NET 4.5) と PHP WordPress プラグインの両方を作成しています。
質問 1: 暗号化
私が使用する予定のサーバー側のデータを暗号化するための現在のプロセスは、この記事に基づいています。要約すると、サーバーに保存されている独自の公開鍵を使用して、各ユーザーのデータを非対称に暗号化することを提唱しています。このデータを復号化するための秘密鍵は、ユーザーのパスワードを使用して対称的に暗号化され、保存されます。この方法では、データベースが盗まれた場合でも、ユーザーのパスワード ハッシュを破る必要があり、その場合でも、すべてのユーザーのデータに対してプロセスを繰り返す必要があります。
著者自身が指摘した唯一の弱点であり、私の質問の要点は、ユーザーがログインしている間、復号化されたキーがセッション ストレージに保存されるという事実です。この記事で提案されている対処方法は、ユーザーがログインしている時間を制限することです。より良い解決策は、そのキーを有効期間の短い安全な Cookie に保存することだと思いました (もちろん、プロセス全体は HTTPS 経由で行われます)。 . そうすれば、攻撃者がユーザーのコンピューターを制御し、Cookie を読み取ることができる場合、おそらくパスワードをキーログしてログインすることができ、データベースを盗む必要はありませんが、攻撃者がサーバーへのアクセスを取得したとしても、復号化することはできません。 HTTPS トラフィック (またはできるかどうかはわかりません。)
復号化されたキーを一時的に保存するには、安全な Cookie またはセッション ストレージを使用する必要がありますか?
質問 2: ストレージ
私がまだ解決したい 2 番目のことは、データを保存する方法です。これは、より効率的な問題です。すべてのユーザーが独自の暗号化キーを持っているため、すべてのユーザーのレコードを個別に保存する必要があります。レコードを表すオブジェクトの配列を持つ暗号化された JSON を含む、すべてのユーザーのデータの「ブロック」を保存する必要があるのか 、それとも実際のデータ構造を持つテーブルにレコードを保存し、各データフィールドを暗号化する必要があるのか わかりません鍵とは別に。
私はデータを 1 つのブロックとして保存することに傾いています。おそらく数千の個別のフィールドよりも、一度に 1 つの大きなデータ ブロックを復号化する方が効率的であるように思えます。また、データを適切な構造で保存したとしても、データはすべて BLOB になるため、MySQL の WHERE や ORDERBY などを使用することはできません。
ユーザーごとに大きなブロックとしてデータを保存する必要がありますか、それともさまざまなフィールドに分けて保存する必要がありますか?
質問 3: 転送
DBF ファイルからデータを抽出し、基本的に「差分」を作成します。これにより、前日のデータから抽出された現在のデータを比較し、変更されたユーザーのブロックのみをアップロードします (レコードのみをアップロードすることはできません)。 、おそらくユーザーのデータをブロックに保存することになるため)。また、削除されたユーザーの「削除」手順も含めます。これは、データベースに数十万のレコードがあり、合計で 200 MB を超えており、サイズが毎日増加しているためです。
私の現在の計画は、このすべてのデータを JSON ファイルに書き込み、gzip してサーバーにアップロードすることです。私の質問は、データのセキュリティを確保しながらそれを行うにはどうすればよいですか? 当然、アップロードは HTTPS 経由で行われ、許可されたアップロードのみを許可する API パスワードを設定していますが、私の主な関心事は、サーバーが侵害された場合にデータを保護する方法です. 攻撃者が処理中にサーバーから JSON ファイルを取得することは望ましくありません。私が持っていた 1 つのアイデアは、サーバーにユーザーの公開鍵のリストを送信してもらい、アップロードの前にソフトウェアで暗号化を実行することでした。それがそのデータを保護する唯一の方法であるように私には思えます。おそらくAPIキーまたは特別なパスワードを使用して、JSONファイル全体を暗号化できますが、攻撃者が復号化されたファイルにそのままアクセスできる場合は意味がありません. はサーバー上で処理されています。それは良い解決策ですか?
クライアント側でデータを個別に暗号化する必要がありますか、それともサーバーに安全に転送してそこで暗号化する方法はありますか?
回答ありがとうございます。以前にこのような問題に対処したことがある人から聞いてみたいです。
注: Programmersに相互投稿されました。コメントを参照してください。