37

MSDN によると、SecureStringの内容は安全性を高めるために暗号化されているため、プログラムがディスクにスワップされた場合、文字列の内容を傍受することはできません。

そのような暗号化はどのようにして可能になるのだろうか? アルゴリズムは固定されているため、よく知られているか演繹可能 (たとえば、業界のアルゴリズムで広く使用されている 7 つのうちの 1 つ) であり、プログラムのどこかにキーが必要です。そのため、攻撃者は暗号化された文字列を取得し、キーを取得してデータを復号化できます。

このような暗号化はどのように役立つのでしょうか?

4

4 に答える 4

21

キーの導出に使用される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 は、マスター キーがユーザー パスワードに基づいており、あるユーザーの保護されたデータを別のユーザーが保護解除できないという点で、ユーザー レベルの保護を可能にするだけでなく、マスター キーがマシン固有の情報に基づいているという点で、マシン レベルの保護も提供します。マシン レベルのマスター キーを使用すると、アプリケーションは保護されたデータを格納できるため、アプリケーションのすべてのユーザーが保護を解除できます。既に説明したプロセスとの唯一の違いは、マスター キーがユーザー固有の情報ではなくマシン固有の情報から生成されることです。

于 2011-08-08T12:52:19.037 に答える
11

私はそのコードをある時点で調べましたが、それは Windows を使用advapi32して汚い仕事をしています。そのため、キーはアプリケーションのメモリに保存されません。

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static int SystemFunction040([In, Out] SafeBSTRHandle pDataIn, [In] uint cbDataIn, [In] uint dwFlag)

としてよく知られていRtlEncryptMemoryます。

RtlDecryptMemory( )で復号化しSystemFunction041ます。

コンパイラも同様に何かを行うと確信してSecurityCriticalAttributeいます。

editこれは4.0を使用して反映されました。他のバージョン異なる場合があります。

于 2011-08-08T12:39:18.137 に答える
8

他の人がすでに回答しているように、の内容はSecureStringDPAPI を使用して暗号化されているため、キーはアプリケーションに保存されず、OS の一部です。私は 100% 肯定的ではありませんがSecureString、別のプロセスがメモリのブロックにアクセスしたとしても、単純に暗号化を解除するには、同じ資格情報で実行する必要があるように、ユーザー固有のキーを使用していると思います。 DPAPI を使用したコンテンツ。そうでない場合でも、(理論的には) マシン キーは、別のシステムに転送された場合に、文字列が簡単に解読されるのを防ぎます。

より重要なのSecureStringは、いつ、どのように使用するかです。「延長された」期間メモリに保持する必要があるが、復号化された形式では頻繁に必要とされない文字列データを格納するために使用する必要があります。ある時点で、それを通常の old System.String、またはSystem.Char[]. これは、メモリ内で最も脆弱なときです。これを頻繁に行うと、復号化された文字列の複数のコピーがメモリ内に浮遊し、収集されるのを待つことになります。

原則として、暗号化されたデータ (たとえば、ログイン資格情報) を読み取り、使用頻度が低い (たとえば、PayPal または Amazon API のやり取り) ために保持する必要がある場合は、それらの資格情報を として保存/キャッシュしSecureString、次にそれを復号化します- Web サービス呼び出しを行うのに十分な時間だけ必要であり、復号化されたコピーの寿命が数行のコードだけであることを保証します。

メモリがキャッシュまたはスワップされる前に、復号化されたコピーが収集される可能性を高めるために、クリティカル ブロックなどを使用して、復号化された文字列が使用されている間はコンテキストを切り替える必要がないことを CLR に示唆することも賢明です。

于 2011-08-08T13:37:03.767 に答える
2

DPAPI の魔法によって:

このクラスは、Data Protection API (DPAPI) 保護メモリ モデルを使用してデータを格納します。つまり、SecureString 内に格納されている間、データは常に暗号化された形式になります。暗号化キーはローカル セキュリティ機関サブシステム (LSASS.EXE) によって管理され、DPAPI を介して、プロセス間通信を介してデータを復号化できます。

于 2011-08-08T12:53:21.610 に答える