我试图了解.NET的SecureString的目的.来自MSDN:
System.String类的一个实例都是不可变的,当不再需要时,不能以编程方式安排垃圾收集; 也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除.因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据.
SecureString对象类似于String对象,因为它具有文本值.但是,SecureString对象的值会自动加密,可以修改,直到您的应用程序将其标记为只读,并且可以通过应用程序或.NET Framework垃圾收集器从计算机内存中删除.
初始化实例或修改值时,SecureString实例的值会自动加密.您的应用程序可以呈现实例不可变,并通过调用MakeReadOnly方法防止进一步修改.
自动加密是最大的收益吗?
为什么我不能说:
SecureString password = new SecureString("password");
Run Code Online (Sandbox Code Playgroud)
代替
SecureString pass = new SecureString();
foreach (char c in "password".ToCharArray())
pass.AppendChar(c);
Run Code Online (Sandbox Code Playgroud)
我错过了SecureString的哪个方面?
我正在尝试建立一个自动化的工具,检查我的支票账户上的最近交易(监视我妻子的购买情况).该工具通过SSL发布我的用户名和密码,然后抓取银行页面内容进行交易.当然,所有内容都通过SSL发送,但为了使其自动化,我需要在某处存储我的银行用户名和密码.
所以我开始研究.NET字符串,安全性和SecureString的漏洞.我创建了一个表单,将我的用户名和密码输入SecureString(逐个字符),确保不使用任何System.String.然后我从SecureString中检索一个char [],从中获取一个byte [],将char [0归零,使用DPAPI加密byte []并使用代码内置的salt字符串,将加密的byte []转换为Base64 System.String,将byte []置零,并将加密字符串保存到应用程序设置.
问题是,如何让我在HttpWebRequest中将其恢复为POST数据而不使其成为System.String.我想出的是以下函数(也是URL编码字符而不创建字符串).
/// <summary>
/// Retrieves, (and then zero's,) a character array from the SecureString.
/// Then optionally URL encodes the characters and returns an encoded byte array.
/// Make sure to zero out the byte array when you're done with it.
/// </summary>
/// <param name="secure">The SecureString to be retrieved.</param>
/// <param name="encodingFormat">The encoding format used to retrieve the byte array. The default is UTF-8.</param>
/// <param name="urlEncode">If true will URL …Run Code Online (Sandbox Code Playgroud)