c# - 在 C# 中,处理密码等敏感数据的正确方法是什么?

标签 c# security passwords securestring

此应用显示一个带有文本框的表单,用户应在其中输入用于解密文档的密码。

我有这样的代码:

string password = passwordTextBox.Text;
...
DecryptDocument(password);

但有人告诉我,从技术上讲,这是一个安全漏洞,因为即使在应用程序关闭后,代表密码的数据也可能保留在内存中。

我尝试使用 System.Security.SecureString 类,但现在我正在处理指向 CoTaskMem 的指针,这似乎使问题变得更糟:

SecureString password = new SecureString();
foreach(char i in passwordTextBox.Text.ToCharArray())
password.AppendChar(i);

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password);
int length = password.Length;
byte[] bytes = new byte[length];

Marshal.Copy(ptr, bytes, 0, length);

DecryptDocument(Encoding.Default.GetString(bytes));

Marshal.FreeCoTaskMem(ptr);

如您所见,我似乎并没有让应用程序更安全,因为迟早我将不得不接受输入 (passwordTextBox.Text) 并将其转换为可以传递给DecryptDocument() 函数。

有没有办法解决这个问题,还是我应该只处理这个安全漏洞?

最佳答案

如果您真的想使用 SecureString,则需要端到端地使用它,最好一次只与一个字符交互。每当字符串被解密为字符数组时,您都希望在使用完后显式清除内存。这样做的后果:

  1. 您应该使用直接与 SecureString 一起操作的安全 TextBox 控件。参见 here举一个很好的例子。

  2. 您应该修改 DecryptDocument 以直接获取 SecureString。

  3. 您需要实现解密,以便它花费尽可能少的时间来处理解密的字符。 .NET 中的某些加密体系结构实际上直接支持 SecureString。如果做不到这一点,最好的办法是使用非托管缓冲区,并在用完后明确清除它。

关于c# - 在 C# 中,处理密码等敏感数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11053421/

相关文章:

c# - Json.Net 从驼峰表示法反序列化为标准 .Net 属性表示法(无属性)

javascript - CSP : How to allow unsafe-eval for a given URI prefix (Firefox)

hash - 加盐您的密码 : Best Practices?

security - 如何在数据库上安全地存储用户名/密码(哈希不会)

c# - EF Core 数据库中已经有一个名为 'AspNetRoles' 的对象

c# - 如何使用 Open XML .net sdk 将幻灯片编号添加到 Powerpoint 演示文稿中?

c# - 使用 System.Json 遍历 JSON

java - 为什么在从 applet 使用 RMI 时会出现 AccessControlException?

.net - 现有的细粒度访问控制库/框架?

php - 安全的 PHP 密码输入可能吗?