SecureString是否可以安全地用作全局应用程序变量?

时间:2018-07-23 18:08:14

标签: c# securestring

我有一个带有第一个登录屏幕的应用程序。密码是在密码文本框中输入的,它是一个安全字符串。

我的想法是将此SecureString存储在全局应用程序变量中,因为在某些操作中将需要它,因此我希望避免用户每次都要写密码。一种操作是发送电子邮件,我需要用户名和密码,所以我不希望用户每次想发送和发送电子邮件时都写电子邮件帐户的密码。

我已经阅读了一些帖子,并且我知道最后我将需要来自secureString的纯文本,这是薄弱点,因此,解决方案是减少纯文本在内存中的时间。 Some solutions can be found here

但是我的问题是,全局变量如何是secureString,在不解码的同时它是否安全?如果不是一个好的选择,那么还有其他更好的选择,但是不需要用户在每次操作需要密码时都输入密码吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

集中要在整个应用程序中重用的数据是一种标准设计模式。假设您有一组网页,要在其上显示用户名,或者您需要缓存特定用户的帖子或个人资料。为此,不同的框架提供了不同的工具,例如在Vue.js中,提供了Vuex来实现此机制。

在遇到问题时,您尚未指定正在使用哪个框架,无论是ASP.NetWPF,还是依赖于{{1}的纯C#应用程序}。但是没有问题,有几种方法可以让您实现所追求的目标,并且可以选择自己需要的最佳套件:

1-您可以在应用中开发一个缓存层,并通过特定会话的生命周期来缓存密码或其他数据。为此,您可以依赖“并发集合”,也可以使用EF Core内存数据库。 ({。OWIN在ASP.Net Core中也可用)

2-如果密码要进行一些互操作,那么我建议您使用全局缓存服务器。为此,您可以使用Redis或Alachisoft NCache。

3-如果是Web应用程序,则可以将数据保留在cookie或浏览器的本地存储中。

请记住,就Microsoft所陈述的事实而言,IMemeoryCache可能不会给您带来任何安全优势,

  

SecureString对象类似于String对象,因为它具有文本值。但是,SecureString对象的值固定在内存中,可以使用基础操作系统提供的保护机制(例如加密),可以对其进行修改,直到您的应用程序将其标记为只读为止,然后可以从计算机内存中删除它。通过您的应用程序调用Dispose方法或.NET Framework垃圾收集器。

说;您必须从内存和内存管理的角度看待此类安全性。最后,您必须实现自己的安全提供程序,例如通过散列生成或加密来实现真正的安全性。

答案 1 :(得分:-2)

存储包含密码SecureString不安全。尽管该字符串是经过加密的,这会使窥探者更难发现它是什么,但它仍然存在,并且有可能被解密。

实际上,使用SecureString的主要优点之一是能够在不再需要它时对其进行分配。

在这里看看:

  

总体而言,SecureString比String更安全,因为它限制了   暴露敏感的字符串数据。但是,这些字符串可能仍然是   暴露于有权访问原始内存的任何进程或操作中,   例如在主机上运行的恶意进程,   转储或用户可见的交换文件。而不是使用SecureString   保护密码,建议的替代方法是使用不透明   处理存储在流程外部的凭据。

在不深入了解您的应用程序的情况下,我可以告诉您的是:如果必须存储包含密码的字符串,请使用SecureString。但是,例如,如果可以,则可以使用Windows集成安全性或其他任何机制来传播凭据,甚至更好。

最后,没有应用程序是完全安全的。您必须了解您的攻击媒介……谁将使用该应用程序,将其部署在何处等。否则,您可能会花费太多时间担心一件小事(例如内存转储),而忘记了一个更大的问题(您的数据库安全吗?管理员密码安全吗?)。