2012-06-15 56 views
9

此应用程序显示带有文本框的表单,用户应输入用于解密文档的密码。,处理敏感数据(如密码)的正确方法是什么?

我的代码看起来像这样:

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()函数的字符串。

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

+0

“但从技术上讲,这是一个安全漏洞,因为即使在应用程序关闭后,表示密码的数据仍可能保留在内存中。”** - 虽然这是事实,但它会在记忆中处于随机位置。你有什么担心**“有没有办法解决这个问题,或者我应该只是处理这个安全漏洞?”**这会是什么样的漏洞?** –

+2

这将是这个漏洞:http:// cwe .mitre.org/data/definitions/316.html –

+2

@Ramhound,如果你不担心将文本放在内存中的随机位置,那么根本不值得使用SecureString。公平地说,它确实只增加了少量的安全性;主要关心的是崩溃转储,虽然那些已经可以泄漏各种敏感信息(即目前为了工作目的而解密的所有信息)。 SecureString真正为您购买的唯一东西是泄露密码的可能性降低,这可能会危及密钥(或涉及用户访问的其他服务,如果他们再次使用密码短语的话)。 –

回答

7

如果你真的想使用SecureString,它需要被端到端使用,最好是一次只能交互一个角色。无论何时将字符串解密为字符数组,当您完成使用时,都需要明确地清除内存。对此的后果:

  1. 您应该使用安全的TextBox控件,该控件可以直接与SecureString一起运行。一个很好的例子见here

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

  3. 您需要实施解密,以便尽可能少地使用解密字符。 .NET中的一些加密体系结构实际上直接支持SecureString。如果没有,最好的办法是使用非托管缓冲区,并在完成后明确清除它。

相关问题