4

CryptUnprotectData Windows API 関数と .net SecureString を可能な限り最善の方法で結び付けたいと考えています。CryptUnprotectData は、バイト配列とバイト長で構成される DATA_BLOB 構造を返します。私のプログラムでは、これは Unicode UTF-16 文字列になります。SecureString には、char* と長さのパラメーターを受け取るコンストラクターがあるため、次のようなことができるようにしたいと考えています。

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

これは機能しますが、UTF-16 が可変長であることを除けば、長さの引数として何を使用すればよいかわかりません。上記の例では 2 バイト文字 (BMP) を想定していますが、他のプレーンでは最大 4 バイトになる可能性があります。バイト配列内の UTF-16 文字の数を知る必要があります。値をメモリ内にコピーせずにこれを行う最善の方法は何ですか (それによってセキュリティが損なわれます)。できるだけ早くバイト配列をゼロにして解放する予定です。

4

1 に答える 1

2

私の知る限り、ほとんどの Windows API は UTF-16 コード ポイントを扱います。つまり、サロゲート ペアを 1 文字ではなく 2 つのコード ポイントとして扱います。SecureString のコンストラクターが .NETSystem.Char値 (UTF-16) へのポインターを処理していることを考えると、取得したコード スニペットは問題ないと思います - pbData の要素数はバイト単位でそのサイズの半分です。

たとえばpbData、サロゲート ペアが (ちょうど) 含まれている場合cbDataは 4 になりますが、2 番目の引数として 2 を渡したいと思うでしょSystem.CharSecureString。それが 1 つの非 BMP Unicode 文字であるという事実は、それSystem.Charが表現される UTF-16 値の数とは無関係です。

(そして、そうです、非 BMP データのサポートは少し混乱しています。どこでも正しく理解できる人はほとんどいないと思います。私はそうではないと確信しています。幸いなことに、多くの場合、心配する必要はありません。 ..)

于 2009-02-04T21:05:38.107 に答える