我想尝试扳平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字符的字节数组中的号码。什么是这样做没有在内存中的值复制(从而危及安全)的最佳途径。我打算尽可能快清零并释放字节数组作为可能的。

有帮助吗?

解决方案

大多数使用UTF-16代码点在Windows API的交易,据我所知 - 换句话说,你把代理对作为两个代码点,而不是单个字符。鉴于对SecureString的构造正在处理的指针.NET System.Char值(这是UTF-16)我认为的代码片段,你所得到的是细 - 在pbData的元素数量的的一半它的大小以字节计。

例如,如果pbData含有(只)代理对,cbData将是4,你还是会希望在2通过作为第二个参数 - 因为这是System.Char值的你构建从SecureString数量。它的一个非BMP Unicode字符的事实是无关它在表示UTF-16 System.Char值的数目。

(是的,对于非BMP数据的支持是一个有点乱,我怀疑很少有人得到它的权利无处不在。我敢肯定,我不幸运,在许多地方,你并不需要担心...)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top