Node.jsとMySQLを使用してiOSアプリケーション用のウェブバックエンド/ APIを書いています。私のデータベースには、投稿用のテーブルがあります。投稿のコンテンツを暗号化してください。暗号化に this AESを使用しているとしましょう。
サーバー上のデータを安全に暗号化および復号化できるようにしたいと思います。クライアントとの間でやり取りされるデータは暗号化されませんが、HTTPS経由で送信されます(これは良いアイデアですか?)
私の質問:
キーをどのように生成する必要がありますか?それらはランダムな文字列でなければなりませんか?
メッセージごとに異なるキーが存在するため、どこにキーを格納すればよいですか。
敵対モデル
https API(Node.jsで記述)を実行しているサーバーにすでにアクセスしていて、MySQL DBにアクセスできるユーザーから保護したいと思います。その人がそのテーブル内の暗号化されたデータを復号化できるのを防ぐつもりです。したがって、暗号化されたデータが大量にあり、暗号化のしくみがまだデータを復号化できないことが重要です。
うまくいけば、私はこれを正しく理解しています。クライアントは、SSL暗号化接続を介してサーバーにメッセージを送信します。サーバーはメッセージを取得し、データベースに保存します。あなたは誰かがサーバーに侵入した場合、データベースを読み取ってすべてのメッセージを見ることができるのではないかと心配しています。
したがって、暗号化は自然に適合するように見えます。データベースに保存する前に、メッセージを(それぞれ異なるキーで)暗号化します。ここでの問題は、キーをどうするかです。攻撃者がサーバー上にいるため、サーバーに保存することはできません。彼らは簡単にキーを見つけ、データベース全体を引き出し、すべてを復号化できます。
別のマシンにキーを保存し、そのマシンに暗号化/復号化を行わせるのが最善のオプションのようです。その方法では、攻撃者は最初にマシンに侵入し、次に暗号化/復号化マシンに侵入する必要があります。不可能ではないが、うまくいけばもっと難しい。
別のオプションは、いくつかの暗号化ハードウェアです。これは私の専門知識を超えていますが、企業はキーの保存、暗号化、復号化などの暗号化操作を実行するハードウェアを販売しています。
ここがトリッキーな部分です。攻撃者がすべてのメッセージを復号化するまで、他のマシンまたは暗号化ハードウェアに繰り返し問い合わせることを阻止するものは何ですか?そこに何らかの検出を構築する必要があります。
つまり、敵のモデル(ボックスに対するroot権限を持つ攻撃者)を考えると、問題はかなり困難です。うまくいけば、これらの2つのオプションのいずれかが役立つか、少なくとも他のいくつかの回答が生成されます。