【问题标题】:How to remove TextBox with password from the memory?如何从内存中删除带密码的文本框?
【发布时间】:2018-10-21 21:49:00
【问题描述】:

我有简单的登录表单。

用户获得数字密码后,我需要将文本框销毁到内存中。

这样做就够了吗?

txtPassword.Text = string.Empty;
txtPassword = null;
System.GC.Collect(); 

【问题讨论】:

  • 务实地调用GC并不是一件好事。
  • 没有。文字仍然可以在TextBox;您可能引用的其他一些变量或对象。您可能需要考虑 WPF 的 PasswordBoxSecureString
  • 只是txtPassword.Text = string.Empty; 不工作?
  • @MickyD 我在 SecureString 中传输文本

标签: c# .net winforms passwords


【解决方案1】:

设置成:

txtPassword.PasswordChar = '\0';

【讨论】:

  • 请添加一个(简短的)解释。我了解您打算重写字符串,使其不再包含文本,因此不再包含密码。你能提出你的答案吗?
【解决方案2】:

我想你可能对SecureString感兴趣

System.String 类的实例是不可变的,并且在不再需要时,不能以编程方式安排垃圾回收;也就是说,实例创建后是只读的,无法预测实例何时会从计算机内存中删除。因为 System.String 实例是不可变的,所以看似修改现有实例的操作实际上会创建它的副本以进行操作。因此,如果 String 对象包含密码、信用卡号或个人数据等敏感信息,则存在使用该信息后泄露的风险,因为您的应用程序无法从计算机内存中删除数据。

SecureString 对象与 String 对象的相似之处在于它具有文本值。但是,SecureString 对象的值被固定在内存中,可以使用底层操作系统提供的保护机制,例如加密,可以修改直到您的应用程序将其标记为只读,并且可以从计算机内存中删除通过您的应用程序调用 Dispose 方法或通过 .NET Framework 垃圾收集器。

【讨论】:

  • 我在 SecureString 中传输数据字符串和之后,但我需要使用密码和转换字符串变量销毁 TextBox 到内存。
  • 不足。 WinForms(OP 问题的主题)不支持 SecureStringText 属性或类似属性,与 WPF 的 PasswordBox 不同。 PasswordBox 甚至没有 string Text 属性,而是 SecureString SecurePassword。这为适用于密码的安全字符串奠定了基础。尝试使用 SecureString 作为 WinForms 的事后想法是有风险的
  • @daniele3004 - 将数据从string 传输到SecureString 是没有用的(因为string 仍在内存中,你不会那么容易摆脱它;这就是你的问题基本上是)。 SecureString 的安全性只能通过在(不安全的)内存中永远拥有“完整的”string 来实现。您逐个字符地添加它,逐个按键。就像链接的 MSDN 文章中的示例一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多