gpt4 book ai didi

c# - 从 C# 中的 .NET SecureString 读取单个字符?

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:39 31 4
gpt4 key购买 nike

WPF 的 PasswordBox 返回一个 SecureString,它对窥探者隐藏密码。

问题是你最终必须得到密码的值,而我在网上找到的建议都涉及将值复制到字符串中,这又回到了窥探者的问题。

IntPtr bstr = Marshal.SecureStringToBSTR(secureString);
string password = Marshal.PtrToStringBSTR(bstr);
Marshal.FreeBSTR(bstr);

但是如果你真的仔细想想,你并不真的需要这个值,作为一个字符串。我的意思是,你用密码做什么?您对其进行哈希处理,然后将结果与保存的哈希值进行比较,看看它们是否相同。

换句话说,您不需要将 SecureString 转换为字符串,您只需要能够遍历字符串中的各个字符即可。

但是如何呢?

如何在 C# 中循环遍历 BSTR 中的单个字符,而不将其转换为托管字符串?

编辑:解决方案,以防链接消失:

Marshall 类提供了可以在给定偏移量处从 IntPtr 中提取单个字节或整数的方法。 BSTR 对象包含一个 16 位字符数组,以两个空字节结尾。所以你可以通过循环访问它们:

byte b = 1;
int i = 0;
while ((char)b != '\0')
{
b = Marshal.ReadByte(bstr, i);
// ...
i += 2;
}

(我不关心那个流程控制。我会使用一个 do...while,而不是用一个虚拟值预填充 b,或者我会使用一个 for(;;) 循环,与内部中断,否则我会在长度上循环,我将在下面解释如何获得。)

此外,我可能会使用:

short b = Marshal.ReadInt16(bstr, i);

读取整个 unicode 字符,而不是每个字符的低字节。

您可以通过以下方式获取 BSTR 的长度:

int len = Marshal.ReadInt32(bstr, -4);

这是字节数,不包括空值,不是字符数。

另外 - 使用:

Marshal.ZeroFreeBSTR(bstr);

最佳答案

http://weblogs.asp.net/pglavich/archive/2005/08/15/422525.aspx

此链接显示如何使用 Marshal.SecureStringToBSTR(secretString) 并将其分配给指针并更新指针以循环字符。

关于c# - 从 C# 中的 .NET SecureString 读取单个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458894/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com