他の多くのウェブサイトと同様に、ユーザーのメールアドレスをデータベースに保存しています。セキュリティ対策に誇りを持っていますが、「十分」では不十分な場合もあります。
電子メールアドレスを暗号化された形式で保存し、読み取り可能な形式で取得できるようにするソリューションの検討を開始しましたが、ここでのキャッチは、PHP =コード。つまり、誰かがサーバーに違反してソースコード、データベースのパスワード、およびビジネスインテリジェンスに関係するすべてのものを取得した場合でも、暗号化アルゴリズムがなければまったく役に立たないデータを残しておいてほしいと思います。
これを行うための最良の方法は何ですか?既製のソリューションはありますか?私たちはphpやApacheモジュール、あるいは小さなGoプログラムに沿って何かを考えていました-非常に高速に実行され、コンパイルされた性質のために盗まれた場合に使用不可能になるコンパイルされたもの。
私たちが望むのは次のようなものです:
データベース内の電子メールはこの形式で保存されます
gibbweswwvsknvknsdva
sadjfoaisjdoiasjdoiasj
skdjfajsfoiajsdoij
whatever
次に、これを行ったとき:
$email = $db -> getEmailById(30);
$email = decrypt($email);
復号化関数は実際の復号化を行いますが、phpの外部にあります。システムコマンドを呼び出して、バイナリファイルを実行できます。しかし、decrpytが返すものは、実際に使用可能な電子メールです。
この復号化された電子メールは、システムから送信された電子メールの受信者として、またはユーザーのプロファイルなどに表示される連絡先情報として使用できますが、ユーザーが何らかの方法でDBにニックを入れた場合、表示されるのは上記の意味不明なものだけです。
編集:tdammersは、これがPHP=の外にある必要があるがPHP内から呼び出し可能である必要がある理由を尋ねました。メールアドレスの実際の値を1分間に数千回使用しているため、異なる値になります。したがって、 Webアプリは常に読み取り可能な値に高速にアクセスする必要がありますが、誰かが何らかの形でソースコードまたはデータベース自体を取得した場合、彼は使用可能な値を持たないことを確認する必要があります。これは、ハッカーからだれでも可能です。重大なバグのためにコードの一部が公開されたり、解雇されてから5分後に不満を抱いた元従業員がアクセスを取り消す時間を残したりしました。
「暗号は難しい。暗号は難しい。暗号は簡単な部分だ。」
-ブルース・シュナイアー
電子メールを暗号化するための独自の自作アルゴリズムを考え出すことは、文字通り、暗号化で起こり得る最悪の間違いです。私は双曲的ではありません、それは実際に最悪の間違いです。現代の暗号化の要点は、アルゴリズムが公開されているため、それらをピアレビューできることです。私は決して何らかの理由でプライベートアルゴリズムの使用を検討しません。重要なのは秘密であり、これによりシステムが機能します。
あなたの場合。各クライアントが独自の非対称キーペアを使用した場合、データベースが危険にさらされ、メッセージが安全に保たれる可能性があります。電子メールインフラストラクチャは、暗号化されたテキストを渡すだけで、解読する手段はありません。これが Enigmail の仕組みです。実際、私はEnigmailを使用することを強くお勧めします。なぜホイールを再発明するのですか?
注意すべき点が2つあります。1つはデータを暗号化して「ディスク上」で保護すること、もう1つはこのデータへのアクセスを保護する必要があります。
Oracle(Enterprise Edition)のようなDBには、透過的なデータ暗号化を提供するいくつかのアドオンがあります。実際には、ディスク上でデータを暗号化しているため、DBファイルにアクセスする攻撃者はクリアテキストを使用しません。
MySQLには少なくとも1つの同様のソリューションがあると思います: http://www.gazzang.com/products/ezncrypt-for-databases.html
Safenetには、この透過的な暗号化(およびいくつかの追加機能、以下を参照)を外部アプライアンスとして実行する製品ProtectDB/DataSecureがあります。これはいくつかのDBフレーバーで機能します: http://www.safenet-inc.com/products/data-protection/database-protection/
次のステップは、このデータへのアクセスを制御することです。ユーザーアカウント、IPへのアクセスを制限できますが、攻撃者がアプリケーションを制御できる場合、攻撃者はデータを読み取ることができます。さらに、アプリケーションが1時間あたりX個を超えるレコードを読み取れないように、クエリ制限を課すこともできます。さらに、ロギングを使用し、クエリのしきい値でアラートを生成する必要があります。
透過的な暗号化の代替手段は、個人の安全なデータストアである一種のWebサービスを実装することでした。このアプリケーションのみが暗号化を処理できるようにする必要があります。電子メールを必要とするアプリケーションは、クリアテキストの電子メールにアクセスするために、サービスを照会する必要があります。このようなサービスは、別のマシンに配置する必要があります。
まず、絶対に、絶対に、しないでください独自のアルゴリズムを発明しようとします。あなたは何も得ず、すべてを失います。アルゴリズムは、バイナリ形式であってもリバースエンジニアリングが簡単です。また、独自の暗号を構築することで、内部の知識がまったくなくても暗号がひどいため、システムがクラックされる可能性が非常に高くなります。
次に、スクリプト形式ではなくバイナリ形式でシークレットを入力することは、攻撃者がパスワードを読み取れないようにパスワードを書き戻すことに似ています。攻撃者がまったく決心している場合(そして、明らかにこれまでに迷惑をかけている場合)、あなたは何もしなかっただけで少し不便です。本当に、この種の抽出作業は、対セキュリティ世界の「ハローワールド」です。
最後に、あなたが求めていることは根本的に問題があります。暗号化されたコンテンツを自動的に解読できるシステムが必要ですが、誰かがシステムが知っていることをすべて知っていると、同じことを実行できないように構築する必要があります。それは完全に合理的な期待ではありません。
しかし、状況も絶望的ではありません。セキュリティは利便性とのトレードオフであり、ある程度の利便性と自律性を排除することで、ほとんどの場合、セキュリティを強化できます。
取得する最高のセキュリティについては、すべての暗号化パラメーターがパスワードで保護されたファイルに保存され、ディスクにデコードされることはありません。代わりに、システムを起動するたびに、データベースの操作パラメータを作業メモリに直接抽出するために使用するパスワードを手動で入力します。そのパスワードを持っているのはあなただけで、サーバーを起動または再起動できるのはあなただけです。従業員がその機密情報にアクセスする必要はありません。このように、システム全体が不満のある技術者に盗まれたりコピーされたりした場合、彼はあなたの秘密を抽出したり、システムを起動したりすることはできません。また、あなたは常に午前3時にポケットベルに応答します。 (申し訳ありませんが、利便性のトレードオフ)
または、暗号化を ハードウェアトークン に関連付けることもできます。次に、トークンの所有者がデータを所有します。繰り返しになりますが、コピーのリスクはありませんが、誰かがそのデバイスを盗んだ場合、彼らはデータベースを盗みました。
Truecryptまたは同様のアプローチが解決策になるでしょうか?そのような暗号化されたボリューム上にMySQLデータベースを配置します。他の変更は必要ありません(MySQLデーモンの停止後に、起動時に暗号化されたボリュームをマウント/マウント解除するアクションを保存します)。
侵入者が稼働中のサーバーにアクセスして、たとえばWebアプリケーションとデータを交換した場合でも、私が見るように、機密データを傍受できる可能性があります。ただし、サーバーがシャットダウンして盗まれた場合、十分なパスフレーズが選択されていれば、Truecryptで十分に保護できます。
あなたの問題には非常に簡単な解決策があります:
よく吟味された標準的なアルゴリズムを使用して、メールアドレスを暗号化します。 (つまり、暗号化された電子メールアドレスをデータベースに格納します。)
復号化キーをサーバー上のファイルに保存します。 (PHPソースコードにはありません。PHPソースコードは、このファイルを開いて読み取り、復号化キーをメモリに保存し、そこから使用できます。 。)
このように、ソースコードのコピーを作成する開発者またはハッカーは、電子メールアドレスを復号化できません。さらに、復号化キーはソースコードまたはソース管理リポジトリに保存されません。
もちろん、ハッカーがサーバーに侵入してデータベースのコンテンツと復号化キーを含むファイルのコンテンツを盗む場合でも、電子メールアドレスを復号化できます。しかし、これは避けられません。攻撃者がデータベースのコンテンツ全体を盗むことができ、Webアプリケーションを実行しているシステムへの完全なアクセス権を持っている脅威モデルでは、うんざりしています。 Webアプリケーションが復号化できる場合、ハッカーも復号化できます。それについてあなたができることは何もありません。それは人生の事実です。
私はパーティーに3年遅れていることを知っていますが、Googleでこれを見つけた人々の答えで私が見逃したことを指摘したいと思います。
ハッキングされたWebサイトからのほとんどの「漏洩」はSQLインジェクションの結果であり、ハッカーが生のデータベースファイルに完全にアクセスできるルートサーバーからはほとんど発生しません。 SQLインジェクションは、ハッカーがデータベースによって実行されたクエリを操作し、通常のWebサイトコードを持っているページをレンダリングする攻撃手法です。
最後の部分は非常に重要です。PHPコードはページを通常どおりレンダリングします。これは、メールアドレス復号化コードが正常に実行され、ハッカーが情報を復号化するのに役立ちます。すべてのハッカーが行う必要があること表示するレコードを操作します(例:WHERE id
= 123--)
ハッカーがファイルに完全にアクセスできる場合、ハッカーはおそらくメモリ内のPHPコードとキーにもアクセスできます。