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

我有看起来像这样的代码:

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,则需要端对端使用它,最好一次只交互一个字符。每当将字符串解密为字符数组时,都需要在使用完毕后显式清除内存。后果:

  • 您应该使用直接与SecureString一起操作的安全TextBox控件。参见here就是一个很好的例子。
  • 您应该修改DecryptDocument以直接采用SecureString。
  • 您将要实现解密,以使解密字符花费的时间尽可能少。 .NET中的某些加密体系结构实际上直接支持SecureString。如果不这样做,最好的选择是使用非托管缓冲区,并在使用完后明确将其清除。
  • 关于c# - 在C#中,处理诸如密码之类的敏感数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11053421/

    10-16 20:29