我的asp.net Web应用程序正在从Global.asax的App_start事件中的XML文件中读取和解密密码。但是之后我应该在哪里存储这个密码?将它存储在静态公共变量或应用程序对象中是否足够?
编辑:它是数据库密码
答案 0 :(得分:6)
如果您对此感到担心,请在Application对象中使用SecureString。但是,我不得不警告你,配置文件中的加密密码是维护的噩梦。您应该重新考虑在web.config中以纯文本格式存储它,并且只是拒绝访问除sysadmins和asp.net工作进程用户(可能是NETWORK SERVICE)之外的所有文件的web.config文件
答案 1 :(得分:5)
将其存储在Application
对象中。由于您是在Application_Start
中的Global.asax
事件中执行此操作,因此您可以随时在整个应用程序中使用它。此外,通过将其存储在Application
对象中,您不会使用cookie,viewstate等将其暴露给客户端。
// set it
Application["MyPassword"] = myDecryptedPassword;
并在应用中的其他地方检索它:
// get it
string myDecryptedPassword = Application["MyPassword"].ToString();
答案 2 :(得分:1)
为什么在整个会话期间需要密码?创建cookie或会话值并在用户登录时设置标志。然后,您可以使用此值来检查用户是否已登录。
答案 3 :(得分:0)
为什么有必要加密密码?将它以纯文本形式存储在web.config中的连接字符串中是不可行的吗?
答案 4 :(得分:0)
您可以将密码存储在Application对象中。
但是,我个人的偏好是向Global类添加一个公共静态属性来访问应用程序级数据。这将为您提供Intellisense支持,为您提供类型安全性(例如,您可能“意外地”使用其他类型的数据覆盖Application对象中的密码),并使以后更容易维护您的应用程序。
答案 5 :(得分:0)
SecureString 。
永远不要使用简单的字符串对象,因为它没有加密,可以存活不同的垃圾收集,这意味着你的密码将在整个内存中飞行很长时间,除非你动态分配GB,否则你无法控制它一代可能是相当邪恶的。相反,SecureString在不再使用时会自动删除。
另一方面,在web.config中存储密码时,请始终对其进行加密。您可以使用aspnet_regiis.exe。 (它是.NET Framework工具的一部分)。
因此,假设您将密码存储在名为“DBAccessPassword”的xml元素中,加密命令将如下所示。
aspnet_regiis.exe -pe "DBAccessPassword" -app "/yourApp"
这是一项非常有用的技术,例如,如果您的应用程序容易受到Path Traversal Vulnerability的攻击,那么这种技术可能会有所不同。加密密码总是一个好主意,因为它为您的应用程序增加了额外的安全层。
<强>性能强>
aspnet_regiis默认使用RSA。 RSA它是一种非对称算法,因此,根据您检索密码的时间长短,它可能会导致性能问题。对称密钥算法通常比非对称密钥算法计算密集程度低得多。实际上,非对称密钥算法通常比对称密钥算法慢几百到几千倍。
根据应用程序的类型,您还可以考虑使用其他算法。