2009-10-16 116 views
0

我的asp.net web应用程序正在读取并解密来自Global.asax的App_start事件中的XML文件的密码。但之后我应该在哪里存储此密码?将它存储在静态公共变量中还是应用程序对象足够了?运行时在哪里存储密码?

编辑:它是一种数据库密码

+1

此密码的用途是什么,你需要明文吗? – 2009-10-16 14:57:35

+0

其数据库密码 – user137348 2009-10-16 15:00:48

+0

你如何与你的数据库交互? ADO.NET? LINQ? – 2009-10-16 15:02:28

回答

6

如果您担心这一点,请在Application对象中使用SecureString。但是,我不得不警告你,配置文件中的加密密码是一个维护噩梦。你应该真的重新考虑将其以纯文本形式存储在web.config中,并拒绝访问除sysadmins和asp.net worker进程用户以外的所有web.config文件(可能是NETWORK SERVICE)

+0

公共静态属性怎么样? – user137348 2009-10-19 08:20:34

+0

是的,这显然会更好。我不记得是什么促使我推荐使用应用程序对象 - 我想我是在另一条评论或答案中读到的,或者其他的东西。 :-) – Chris 2009-10-19 16:15:12

1

为什么你需要在整个会话期间的密码?创建cookie或会话值并在用户登录时设置标志。然后可以使用该值检查用户是否已登录。

+0

+1对于Cookies :-) – bastianneu 2009-10-16 14:57:29

+0

它的数据库密码 – user137348 2009-10-16 15:01:38

+0

好吧然后...没有饼干! – bastianneu 2009-10-16 15:03:22

5

将其存储在Application对象中。由于您在Global.asaxApplication_Start事件中执行此操作,因此只要您需要,它就可供您的整个应用程序使用。此外,通过将其存储在Application对象,你是不是通过使用Cookie,视图状态暴露在客户端等

// set it 
Application["MyPassword"] = myDecryptedPassword; 

而且在应用程式中的其他地方找回它:

// get it 
string myDecryptedPassword = Application["MyPassword"].ToString(); 
+0

公共静态属性呢? – user137348 2009-10-19 08:21:05

0

为什么需要输入密码?将它以纯文本形式存储在web.config中的连接字符串中是不可行的?

0

您可以存储密码在Application对象中。

但是,我个人的偏好是为Global类添加一个公共静态属性来访问应用程序级数据。这将为您提供Intellisense支持,为您提供安全类型(例如,您可能会“不小心”在Application对象中使用另一种类型的数据覆盖您的密码),并且稍后可以更轻松地维护您的应用程序。

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是一种不对称算法,因此,根据检索密码的时间长短,可能会导致性能问题。对称密钥算法通常比非对称密钥算法计算密集得多。实际上,非对称密钥算法通常比对称密钥算法慢数百到数千倍。

根据您的应用程序的类型,您还可以考虑使用不同的算法。

相关问题