キーの導出に使用されるDPAPIに関する記事から引用しています。これにより、SecureString に関するほとんどの質問に答えることができます。
はい、SecureString には欠点があり、完全に安全ではありません。データにアクセスする方法があります。たとえば、Hawkeyeをプロセスに挿入することは、SecureString を抽出する方法として MSDN で言及されています。私はこの主張を個人的に検証していません。
DAPI キー管理
DAPI は対称ベースの暗号化技術です。つまり、データの暗号化と復号化の両方に同じキーを使用します。DAPI の使用方法の例に入る前に、DAPI がキーを管理する方法について説明する価値があります。ほとんどの場合、DAPI キー管理プロセスは目に見えないため、通常は気にする必要はありません。これが、DAPI が優れたアプローチである主な理由です。
導入部で、マスターキーはユーザーのログインパスワードから生成されると書きました。これは全体像ではありません。実際には、Windows はユーザーのログイン パスワードを使用してマスター キーを生成します。このマスター キーは、ユーザーのパスワードを使用して保護され、ユーザーのプロファイルと共に保存されます。このマスター キーは、他の多くのキーを派生させるために使用され、データを保護するために使用されるのはこれらの他のキーです。
Windows がこれを行う理由は、アプリケーションがエントロピーと呼ばれる追加情報を個別のキーを生成するプロセスに追加できるようにするためです。ユーザーのログイン アカウントで実行されているすべてのアプリケーションが同じキーを使用していた場合、すべてのアプリケーションが DAPI で保護されたデータの保護を解除できることがわかります。アプリケーションが DAPI で保護されたデータを共有できるようにしたい場合があります。ただし、そうでない場合もあります。アプリケーションがキーの生成にエントロピーを提供できるようにすることで、そのキーはアプリケーション固有になり、そのアプリケーションによって保護されているデータは、エントロピーがわかっている場合にのみ保護を解除できます。
マスター キーを生成し、そのマスター キーを使用して他のキーを生成して実際の暗号化を行う方法は、長い道のりのように思えるかもしれませんが、大きな利点が 1 つあります。ユーザーパスワードで保護されたマスターキーとデータを保護するために使用される実際のキーとの間に追加の抽象化レベルがあるため、ユーザーがパスワードを変更した場合、マスターキーのみを再保護する必要があります。保護されたデータを再保護する必要はありません。マスター キーのサイズはデータよりもはるかに小さいため、パフォーマンスが大幅に節約されます。
ユーザーのパスワードが変更されると、もちろん新しいマスター キーが生成されます。この新しいマスター キーは、新しい個別のキーを生成するために使用されます。ただし、以前に生成された個々のキーはすべて古いマスター キーから派生したものであるため、Windows は以前のマスター キーをすべて保存する必要があります。Windows がマスター キーを忘れることはなく、すべての保護されたデータには、データを保護するためにどのマスター キーが使用されたかを示す GUID が付けられます。そのため、適応性という点では、DAPI はユーザーのパスワードの変更に対応できると同時に、a) 保護されたデータを再保護する必要がないこと、b) 以前にデータを保護するために使用されたキーがまだ利用可能であること、および c ) これはすべて自動的に行われます。
コンピューターがドメインのメンバーでない限り、DAPI は、保護に使用された同じコンピューター上のデータのみを保護解除できます。
DAPI は、マスター キーがユーザー パスワードに基づいており、あるユーザーの保護されたデータを別のユーザーが保護解除できないという点で、ユーザー レベルの保護を可能にするだけでなく、マスター キーがマシン固有の情報に基づいているという点で、マシン レベルの保護も提供します。マシン レベルのマスター キーを使用すると、アプリケーションは保護されたデータを格納できるため、アプリケーションのすべてのユーザーが保護を解除できます。既に説明したプロセスとの唯一の違いは、マスター キーがユーザー固有の情報ではなくマシン固有の情報から生成されることです。