【问题标题】:Create SecureString from unmanaged unicode string从非托管 unicode 字符串创建 SecureString
【发布时间】:2009-02-04 21:02:19
【问题描述】:

我想尝试以最好的方式将 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 字符的数量。在不复制内存中的值(从而损害安全性)的情况下,最好的方法是什么。我计划尽快清零并释放字节数组。

【问题讨论】:

    标签: c# unicode pinvoke marshalling securestring


    【解决方案1】:

    据我所知,大多数 Windows API 都处理 UTF-16 代码点 - 换句话说,您将代理对视为两个代码点而不是单个字符。鉴于 SecureString 的构造函数正在处理指向 .NET System.Char 值(UTF-16)的指针,我认为您拥有的代码 sn-p 很好 - pbData 中的元素数量是 大小的一半(以字节为单位)。

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

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

    【讨论】:

    • 非常感谢乔恩,这很有意义!这些东西对我来说都是新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多