从C#中的.NETSecureString读取单个字符?WPF的PasswordBox返回一个SecureString,它对窥探者隐藏密码。问题是您最终不得不获取密码的值,而我在网上找到的建议都涉及将值复制到字符串中,这又让您回到了窥探者问题。IntPtrbstr=Marshal.SecureStringToBSTR(secureString);字符串密码=Marshal.PtrToStringBSTR(bstr);元帅.FreeBSTR(bstr);但是如果你真的考虑一下,你不需要这个值作为一个字符串。我的意思是,你用密码做什么?您对其进行哈希处理,并将结果与??保存的哈希值进行比较,看看它们是否相同。换句话说,您不需要将SecureString转换为字符串,您只需要能够遍历字符串中的各个字符。但是怎么办?如何循环遍历CTR中BSTR中的单个字符,而不将它们转换为托管字符串?编辑:解决方案,以防链接消失:Marshall类提供了从给定偏移量处的IntPtr中提取单个字节或整数的方法。BSTR对象包含一个16位字符数组,以两个空字节结尾。所以你可以通过循环访问它们:byteb=1;诠释我=0;while((char)b)!=''){b=Marshal.ReadByte(bstr,i);//...我+=2;}(我不关心那个流程控制。我用过do...while而不是用虚拟值预填充b,或者我用过for(;;)循环,内部中断,或者我已经完成length,我会在下面解释。)或者,我可能会使用:shortb=Marshal.ReadInt16(bstr,i);读取整个unicode字符,而不是每个字节的低字节。您可以通过以下方式获取BSTR的长度:intlen=Marshal.ReadInt32(bstr,-4);这是字节数,不包括空值,而不是字符数。另外-使用:Marshal.ZeroFreeBSTR(bstr);http://weblogs.asp.net/pglavich/archive/2005/08/15/422525.aspx此链接显示如何使用Marshal.SecureStringToBSTR(secretString)并将其分配给指针并更新指针以循环显示字符。尝试这样的事情我将链接中的VB代码示例lc转换为C#希望这可以帮助您入门Char[]input="SuperSecretString".ToCharArray();SecureString秘密=newSecureString();for(intidx=0;idxThisworksforme:以上是C#学习教程:Readingasinglecharacterfrom.NETSecureStringinC#?分享全部内容,如果对大家有用又需要进一步了解C#学习教程,希望大家多多关注---staticcharGetChar(SecureStringvalue,intidx){IntPtrbstr=Marshal.SecureStringToBSTR(value);try{//Indexin2-byte(char)chunks//TODO:一些范围验证可能会很好return(char)Marshal.ReadByte(bstr,idx*2);}finally{Marshal.FreeBSTR(bstr);}}本文收集自网络,不代表立场,如有涉及侵权请点击维权联系管理员已被会员删除如需转载请注明出处:
