我的asp.net web应用程序正在读取并解密来自Global.asax的App_start事件中的XML文件的密码。但之后我应该在哪里存储此密码?将它存储在静态公共变量中还是应用程序对象足够了?运行时在哪里存储密码?
编辑:它是一种数据库密码
我的asp.net web应用程序正在读取并解密来自Global.asax的App_start事件中的XML文件的密码。但之后我应该在哪里存储此密码?将它存储在静态公共变量中还是应用程序对象足够了?运行时在哪里存储密码?
编辑:它是一种数据库密码
如果您担心这一点,请在Application对象中使用SecureString。但是,我不得不警告你,配置文件中的加密密码是一个维护噩梦。你应该真的重新考虑将其以纯文本形式存储在web.config中,并拒绝访问除sysadmins和asp.net worker进程用户以外的所有web.config文件(可能是NETWORK SERVICE)
公共静态属性怎么样? – user137348 2009-10-19 08:20:34
是的,这显然会更好。我不记得是什么促使我推荐使用应用程序对象 - 我想我是在另一条评论或答案中读到的,或者其他的东西。 :-) – Chris 2009-10-19 16:15:12
为什么你需要在整个会话期间的密码?创建cookie或会话值并在用户登录时设置标志。然后可以使用该值检查用户是否已登录。
+1对于Cookies :-) – bastianneu 2009-10-16 14:57:29
它的数据库密码 – user137348 2009-10-16 15:01:38
好吧然后...没有饼干! – bastianneu 2009-10-16 15:03:22
将其存储在Application
对象中。由于您在Global.asax
的Application_Start
事件中执行此操作,因此只要您需要,它就可供您的整个应用程序使用。此外,通过将其存储在Application
对象,你是不是通过使用Cookie,视图状态暴露在客户端等
// set it
Application["MyPassword"] = myDecryptedPassword;
而且在应用程式中的其他地方找回它:
// get it
string myDecryptedPassword = Application["MyPassword"].ToString();
公共静态属性呢? – user137348 2009-10-19 08:21:05
为什么需要输入密码?将它以纯文本形式存储在web.config中的连接字符串中是不可行的?
您可以存储密码在Application对象中。
但是,我个人的偏好是为Global类添加一个公共静态属性来访问应用程序级数据。这将为您提供Intellisense支持,为您提供安全类型(例如,您可能会“不小心”在Application对象中使用另一种类型的数据覆盖您的密码),并且稍后可以更轻松地维护您的应用程序。
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是一种不对称算法,因此,根据检索密码的时间长短,可能会导致性能问题。对称密钥算法通常比非对称密钥算法计算密集得多。实际上,非对称密钥算法通常比对称密钥算法慢数百到数千倍。
根据您的应用程序的类型,您还可以考虑使用不同的算法。
此密码的用途是什么,你需要明文吗? – 2009-10-16 14:57:35
其数据库密码 – user137348 2009-10-16 15:00:48
你如何与你的数据库交互? ADO.NET? LINQ? – 2009-10-16 15:02:28