C# 从非托管unicode字符串创建SecureString
我想尝试以最好的方式将CryptUnprotectData windows API函数和.net SecureString绑定在一起。CryptUnprotectData返回一个由字节数组和字节长度组成的数据块结构。在我的程序中,这将是一个Unicode UTF-16字符串。SecureString有一个构造函数,它接受char*和length参数,因此我希望能够执行以下操作: SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2); SecureString ss=SecureString((char*)textBlob.pbData,textBlob.cbData/2);C# 从非托管unicode字符串创建SecureString,c#,unicode,pinvoke,marshalling,securestring,C#,Unicode,Pinvoke,Marshalling,Securestring,我想尝试以最好的方式将CryptUnprotectData windows API函数和.net SecureString绑定在一起。CryptUnprotectData返回一个由字节数组和字节长度组成的数据块结构。在我的程序中,这将是一个Unicode UTF-16字符串。SecureString有一个构造函数,它接受char*和length参数,因此我希望能够执行以下操作: SecureString ss = SecureString((char*)textBlob.pbData, text
这是可行的,但UTF-16是可变长度的,所以我真的不知道使用什么作为长度参数。上面的示例假定为2字节字符(BMP),但对于其他平面,它可能最多为4字节。我需要知道字节数组中UTF-16字符的数量。在不复制内存中的值(从而影响安全性)的情况下,最好的方法是什么。我计划尽快清零并释放字节数组。据我所知,大多数Windows API都处理UTF-16代码点-换句话说,您将代理项对视为两个代码点,而不是单个字符。考虑到SecureString的构造函数正在处理指向.NET
System.Char
值(UTF-16)的指针,我认为您得到的代码片段很好——pbData中的元素数是其字节大小的一半
例如,如果pbData
包含(仅)一个代理项对,cbData
将是4,并且您仍然希望传入2作为第二个参数,因为这是构建SecureString
的System.Char
值的数量。它是一个非BMP unicode字符这一事实与它所表示的UTF-16System.Char
值的数量无关
(是的,对非BMP数据的支持有点混乱,我怀疑几乎没有人在任何地方都能做到。我肯定我没有。幸运的是,在许多地方你不需要担心……非常感谢Jon,这非常有意义!这些东西对我来说还是新鲜的。