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 代码点 - 换句话说,您将代理对视为两个代码点而不是单个字符。鉴于 SecureString 的构造函数正在处理指向 .NETSystem.Char值(即 UTF-16)的指针,我认为您得到的代码片段很好 - pbData 中的元素数量其字节大小的一半。

例如,如果pbData包含(仅)一个代理对,则为cbData4 并且您仍希望将 2 作为第二个参数传入 - 因为这是System.Char您构造SecureStringfrom 的值的数量。它是一个非 BMP unicode 字符这一事实与它所System.Char代表的 UTF-16 值的数量无关。

(是的,对非 BMP 数据的支持有点混乱,我怀疑很少有人能在任何地方都能做到这一点。我敢肯定我没有。幸运的是,在很多地方你不需要担心。 ..)

于 2009-02-04T21:05:38.107 回答