我目前正在尝试在Windows窗体中制作一个密码存储系统,听说一旦使用完毕,应该尽快覆盖包含敏感信息的字符串。由于字符串在C#中是不可变的,我决定尝试使用指针清除包含用户名和密码的两个TextBox
。我尝试了中的两个方法。你能通过一个不安全的方法更改(不可变(字符串的内容吗?(OP的方法和公认的答案(,但他们似乎都无法从TextBox
中清除文本(尽管他们适用于普通字符串(;我在网上也找不到更多的答案。这是一个预定的功能,还是我在代码中做错了什么?我的方法过分了吗?我的方法根本不起作用吗?
代码:
// First method that I tried
unsafe
{
if (this.textBox1.Text != String.Empty)
fixed (char* usr = this.textBox1.Text)
for (int i = 0; i < this.textBox1.Text.Length; i++)
usr[i] = ' ';
if (this.textBox2.Text != String.Empty)
fixed (char* pwd = this.textBox2.Text)
for (int i = 0; i < this.textBox2.Text.Length; i++)
pwd[i] = ' ';
}
// Second method that I tried
if (this.textBox1.Text != String.Empty)
{
GCHandle gcU = GCHandle.Alloc(this.textBox1.Text, GCHandleType.Pinned);
unsafe
{
char* usr = (char*)gcU.AddrOfPinnedObject();
for (int i = 0; i < this.textBox1.Text.Length; i++)
usr[i] = ' ';
}
gcU.Free();
}
if (this.textBox2.Text != String.Empty)
{
GCHandle gcP = GCHandle.Alloc(this.textBox1.Text, GCHandleType.Pinned);
unsafe
{
char* pwd = (char*)gcP.AddrOfPinnedObject();
for (int i = 0; i < this.textBox2.Text.Length; i++)
pwd[i] = ' ';
}
gcP.Free();
}
编辑:如果有人想知道,我正在使用。NET Framework 4.8。
通常,内存中的数据可能包含敏感数据。程序操作的所有数据都需要在某个时刻存储在内存中,因此内存中当然也有敏感数据(不仅是密码,当然还有使用此密码获取的数据、用户名、电子邮件地址等(。一旦数据不再使用,就可以(或多或少地(从内存中擦除数据,但这并不能真正解决问题,它可能只是降低了数据泄露的风险。
然而,正如我在上面的评论中所说,如果有人访问了程序内存,安全性就会受到威胁,他或她可以对程序数据为所欲为,也可以在活动用户的许可下开始执行任务。
在Windows上,通常允许调试自己的程序,因此在计算机上执行的任何程序都可以(理论上(从同一用户拥有的任何其他正在运行的程序中读取所有数据,因为调试意味着读取和写入程序的内存。或多或少,防止这种情况发生的唯一方法是防止电脑被恶意软件感染。
这完全独立于所使用的程序语言。