EternalWindows
DPAPI / DPAPIの位置づけ

通常のCryptoAPIによる暗号化は、使用するCSPや暗号化アルゴリズムの種類など、 幅広い選択肢をアプリケーションに提供しています。 また、暗号化に使う鍵についても、状況に応じてセッション鍵、 または公開鍵/秘密鍵の鍵ペアを利用することができ、柔軟性があるといえます。 しなしながら、この鍵という存在は、 アプリケーションに鍵を管理させる手間も生じさせているといえます。 つまり、セッション鍵ならば鍵の作成に使用するパスワードを保護しなければならず、 鍵ペアならばそれを鍵コンテナに格納しなければなりません。 DPAPI(Data Protection API)は、このような鍵の管理をアプリケーションから隠蔽し、 複雑な手順を踏むことなく暗号化を行うことができます。

DPAPI(特にCryptProtectData)による暗号化は、マスターキーという存在に大きく依存しています。 マスターキーとは、512ビットの乱数から派生したデータであり、 各ユーザーのユーザープロファイルに予め保存されています。 DPAPIによる暗号化の流れは、このマスターキーと動的に生成したランダムな16バイトから 一時的なセッション鍵を作ることであり、このセッション鍵を使って暗号化が行われています。 マスターキーという言葉は、キーという語句を含んでいますが、 それはセッション鍵を作成するために必要なデータに過ぎません。 DPAPIによって作成されたデータには、暗号されたデータと先に述べた16バイトが格納され、 復号化時にはこの16バイトとユーザープロファイルに格納されたマスターキーが参照されます。 なお、マスターキーが常に同じ値ではセキュリティ上好ましくないため、 90日毎に新しいマスターキーがシステムによって作成されることになっています。 DPAPIによって暗号化されたデータには、使用したマスターキーの一意なIDが格納されており、 複合化の際にはこのIDを基に参照するマスターキーを決定します。

マスターキーという存在がもたらす最大の効果は、 暗号化したデータを複合化できるアプリケーションが、 暗号化時のユーザーに限定されることです。 つまり、暗号化したデータがシステム内の別ユーザーや、 他のコンピュータに漏洩したとしても、そのデータは複合化することができません。 何故なら、複合化に必要なマスターキーは、 暗号化時のユーザーのユーザープロファイルに格納されており、 別のユーザーや他のコンピュータはこれを参照することができないからです。 また、マスターキーはユーザーのログオンパスワードによって暗号化されているため、 マスターキーが漏洩された場合でも、データを複合化することはできません。

暗号化時のユーザーだけがデータを複合化できるという事実は、 そのユーザーとして実行されているアプリケーションならば、 無条件にデータを複合化できるということも意味しています。 これを防ぐには、エントロピー(複合化を困難にするためのランダム値)を 指定してDPAPIを呼び出す方法がありますが、 これはあまり推奨される方法ではありません。 DPAPIの魅力は、鍵を作成するための情報をアプリケーションが意識せずに済む点にありますが、 エントロピーという情報が存在すれば、アプリケーションはそれを管理する必要が生じてしまうからです。 理想としては、DPAPIが暗号化したデータを他のアプリケーションから参照されない場所に格納することですが、 DPAPIはデータを暗号化するだけで、安全な格納場所までは提供していません。


戻る