管理対象外のUnicode文字列からSecureStringを作成します。
-
21-08-2019 - |
質問
私は、CryptUnprotectData Windows API関数と一緒に.NETのSecureString最善の方法を結び付けるために試してみたいと思っています。 CryptUnprotectDataは、バイトの配列とバイト長からなるDATA_BLOB構造を返します。私のプログラムでは、これはUnicodeのUTF-16文字列になります。 SecureStringは、char *と長さのparamsを取るコンストラクタを持っているので、私のような何かを行うことができるようにしたいと思います:
SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);
これは可変長なので、私は本当に長引数として使用するかわからないUTF-16を除き、動作します。上記の例では、2つのバイト文字(BMP)を想定しているが、他の面のためには、4バイトまでとすることができます。私はバイト配列でUTF-16文字の数を知る必要があります。 (これにより、セキュリティを犠牲に)メモリに周りに値をコピーせずにこれを行うための最善の方法は何ですか。私はゼロと可能な限り迅速にバイト配列を解放することを計画しています。
解決
私の知る限り承知しているとしてUTF-16コード・ポイントを持つWindows APIのお得な情報のほとんどは - つまり、あなたが2つのコード・ポイントの代わりに、単一の文字としてサロゲートペアを扱います。 SecureStringのコンストラクタは、(UTF-16です)の.NET System.Char
値へのポインタを扱っている私はコードはあなたが持っているスニペットを考えることを考えると結構です - pbData のあるの半分の要素数バイト単位のサイズます。
たとえばpbData
が含まれている場合(ただ)サロゲートペア、cbData
は4だろうとあなたはまだ2番目の引数として2を渡したいと思います - それはあなたからSystem.Char
を構築しているSecureString
値の数だから。それは一つの非BMPのUnicode文字だという事実は、それがで表されていますUTF-16 System.Char
値の数とは無関係です。
(そして、はい、私は。幸いにも多くの場所で、あなたが必要としませんしません確信しています。非常に少数の人々は、右のどこにでもそれを得る非BMPデータのサポートは混乱のビットがある、と私は疑い)...心配する