此应用程序显示带有文本框的表单,用户应在其中输入用于解密文档的密码。
我有看起来像这样的代码:
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,则需要端对端使用它,最好一次只交互一个字符。每当将字符串解密为字符数组时,都需要在使用完毕后显式清除内存。后果:
关于c# - 在C#中,处理诸如密码之类的敏感数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11053421/