シナリオ
$server_key
で暗号化されます$_COOKIE['encrypted_key']
変数として保存されるようになりました(ユーザーがページをロードするたびに入力する必要はありません)。$server_key
はアプリサーバーの設定ファイル内に保存されます$_COOKIE['encrypted_key']
を復号化して($server_key
を使用して)復号化されるため、マスターキーが明らかになります$_COOKIE['encrypted_key']
はブラウザの終了時に破棄されます脅威
攻撃者がユーザーのデバイス/ Cookieと暗号化されたデータ(アプリサーバーの構成ファイルではない)にアクセスする。
質問
マスターキーを$server_key
で暗号化し、$server_key
をアプリサーバーの構成ファイル内に保存することは意味がありますか?
推論
$server_key
のみ、または$_COOKIE['encrypted_key']
のみを取得しても、何も侵害されません。攻撃者は両方を取得する必要があります。
更新
脅威モデルは不完全です。あなたが見逃したもののいくつかはここにあります:
1)マスターキーとサーバーキーは静的な値のように見えます。つまり、Cookieの値は一定であり、Cookieの値を持っている人はだれでもサーバーにそれを再生して、そのユーザーのすべてのプレーンテキストデータを盗む(スパイダーする)ことができます。
1a)Cookieはプロキシなどの他の場所にも保存されます。
2)サーバーが危険にさらされている場合、攻撃者はマスターキースペースをブルートフォースで強制し、ユーザーごとにユーザーデータを復号化できます。これが成功する可能性は、マスターキーの長さと暗号化アルゴリズムに完全に依存します。
3)ユーザーはサーバーキーを取得できます。彼らはマスターキーを知っており、Cookieを表示できるため、サーバーキーをブルートフォースオフラインにすることができます。この場合も、成功の要因はキーの長さとアルゴリズムに依存します。
4)サービスが暗号化されたプレーンテキスト接続を介して配信されているかどうかは不明です。後者の場合、マスターキーとCookie値の両方が、同じネットワーク上の攻撃者によって観察される可能性があります。前者の場合、接続がダウングレードされるか、他の脆弱性が存在する可能性があります。
5)攻撃者がサーバーをハッキングした場合、受信したすべてのマスターキーのコピーを保持するようにログインコードを変更できます。違反が数か月/数年にわたって気付かれないことがよくあります。
$ server_keyの目的はCookieのリプレイを無効にすることです。リプレイはできますが、$ server_keyがわかりません
サーバーキーでマスターキーを暗号化しても、リプレイアタックは無効になりません。攻撃者は、暗号化されたマスターキーをサーバーに送信するだけで、攻撃者が必要とするデータを復号化することができます。サーバーが 混乱した代理 になります。攻撃者はこれを行うためにサーバーを危険にさらしたり、サーバーの鍵を入手したりする必要はありません。
この攻撃を制限するには、暗号化されたマスターキー内に有効期限とIPアドレスを追加します。つまり、Encrypt(MasterKey + Expiry + IP address)、サーバーは暗号化されたトークンを使用する必要があります。指定されたIPアドレス。