web-dev-qa-db-ja.com

パブリック/プライベートAPI、暗号化(またはハッシュ)データ、およびサーバーの侵害に対する戦略

この非常に単純化された現実的なシナリオでは、ロードバランサーと単一のIPアドレスの後ろに2つのコンボWeb /データベースサーバー(A)があります。また、1つのIPアドレスからのみアクセスを許可します-クライアント(B)。各データベースサーバーには、読み取り専用の秘密のID情報(メールアドレス、ユーザー名など)を格納する必要があります。

サーバー(A)を侵害したハッカーがサーバー(B)にもアクセスできない限り、データを操作できないようにするソリューションが必要です。

クライアントサーバー(B)が秘密/公開APIキーペアの公開キーを使用して、サーバー(A)でこのID情報(電子メールアドレスなど)の一致を検索し、サーバーなし(A)で検索する戦略が必要ですその結果を評価し、秘密鍵を使用して評価するために結果を(B)に戻します。 理論は、ハッカーがサーバー(A)にルートレベルのアクセス権を取得した場合、md5()に対するブルートフォース攻撃でさえも、データをデコードするためにそれを使用して何もできないということです、sha1()、sha256()、または任意のハッシュアルゴリズムに対して

ここでは、例として機能しない戦略を示します。 PHPのlibsodium(一般的な公開/秘密鍵システム)があるとします。これを使用してデータを暗号化し、(A)に格納します。次に、(B)がルックアップを行う場合、公開鍵を送信し、(A)の秘密鍵と結合され、ハッシュが生成され、そのハッシュがデータベース内のハッシュと照合されます。 (したがって、ハッシュされた電子メール要求がデータベース内のハッシュされた電子メールアドレスと一致するかどうかがわかります。)この戦略の問題は、ルートレベルのアクセスでサーバー(A)が侵害された場合、攻撃者がしなければならないことは、Webトラフィックを傍受することだけです。 (B)からの公開キーを見つけるには、それをPHPサーバースクリプトで(A)からの秘密キーと組み合わせてから、その情報を使用して強力なブルートフォーススクリプトを実行し、このブルートフォース攻撃は、md5()とsha1()を破壊するために使用されていますが、誰かのsha256や他のハッシュAPIを破壊するためにも使用できます。

正しいので、機能しません。サーバー(A)で一致の結果を解釈できない方法があった方がよいでしょう。そして、最終的な評価のためにサーバー(B)に送り返す必要があります。その後、サーバー(B)の秘密鍵で結果を復号化する必要があります。

PHPを使用、ハッカーがそのプログラマーの公開/秘密キーペアの秘密キーを持たない限り、侵害されたデータストアがハッカーに有益な情報を提供しないプログラマーのAPIキー戦略を説明できますか?

3
Volomike

コメントで述べたように、私はすべての暗号化/復号化を(B)で実行し、(A)はデータを格納するだけです。

例として:

これは(B)で起こります

_string encryptedKey = encrypt('John Smith');
string encryptedData = encrypt('121 Main Street');
_

(B)は2つの暗号化された文字列を(A)に送信します。

(A)2つの暗号化された文字列をキー/値データベースに格納します。

その後、(B)は(A)_send me the value associated with the key "xxx"_にメッセージを送信してデータを要求できます。ここで、xxxはencrypt('John Smith')呼び出しの出力です。

(A)暗号化についてまったく知識がない。 (A)はまた、何が格納されているのかを知りません-ただキーのための「不透明な文字列」と値のための別の「不透明な文字列」。

(B)必要に応じて対称暗号化を使用できます-それは問題ではありません。

5
Dan Pichelman