从C#.NET程序SecureString的读取单一字符?(Reading single chars

2019-09-19 10:15发布

WPF的PasswordBox返回SecureString的,其中隐藏窥探者的密码。

问题是,你最终要得到密码的值,并建议我在网上所有涉及到的值复制到一个字符串,它可以让你回到窥探者的发现问题。

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

但如果你真的仔细想想,你并不真正需要的价值,作为一个字符串。 我的意思是,你有密码吗? 你哈希它,然后将结果比较保存的哈希值,看看它们是否相同。

换句话说,你不需要到SecureString的转换为字符串,你只需要能够在单个字符遍历的字符串中。

怎么会呢?

我如何遍历所有的单个字符的BSTR,在C#中,无需将其转换为托管字符串?

编辑:该解决方案,在情况下,链接消失:

马歇尔类提供了可以从一个IntPtr提取单个字节或整数,在给定偏移的方法。 甲BSTR对象包含的16位字符的数组,由两个空字节终止。 所以,你可以通过循环访问它们:

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

(我不喜欢那种流量控制。我会用一个做...同时,而不是预填充B,其中A虚拟值,或者我会使用的(;;)循环,内部断裂,或者我会环绕在长,我解释如何得到,下文)。

另外,我可能会使用:

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

阅读整个Unicode字符,而不是仅仅每个字节低。

你可以得到BSTR以长度:

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

这是字节包括空值的数量,而不是,不字符的数目。

此外 - 使用:

Marshal.ZeroFreeBSTR(bstr);

Answer 1:

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

此链接显示如何使用Marshal.SecureStringToBSTR(secretString)并将其分配给一个指针,并通过文字更新指针循环。



Answer 2:

这为我工作:

    static char GetChar(SecureString value, int idx)
    {
        IntPtr bstr = Marshal.SecureStringToBSTR(value);
        try
        {
            // Index in 2-byte (char) chunks
            //TODO: Some range validation might be good.
            return (char)Marshal.ReadByte(bstr, idx * 2);
        }
        finally
        {
            Marshal.FreeBSTR(bstr);
        }
    }


Answer 3:

尝试这样的事情我转换的VB代码示例,LC在链接到C#有你希望这有助于让你开始

Char[] input = "Super Secret String".ToCharArray();
SecureString secret = new SecureString();

for (int idx = 0; idx <= input.Length - 1; idx++) {
    secret.AppendChar(FileSystem.input(idx));
}
SecurePassword.MakeReadOnly();

IntPtr pBStr = Marshal.SecureStringToBSTR(secret);

string output = Marshal.PtrToStringBSTR(pBStr);
Marshal.FreeBSTR(pBStr);

SHA512 sha = new SHA512Managed();
byte[] result = sha.ComputeHash(Encoding.UTF8.GetBytes(output));


文章来源: Reading single chars from a .NET SecureString in C#?