Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时在哪里存储密码?_C#_Asp.net - Fatal编程技术网

C# 运行时在哪里存储密码?

C# 运行时在哪里存储密码?,c#,asp.net,C#,Asp.net,我的asp.net web应用程序正在Global.asax的App_start event中读取和解密XML文件中的密码。但是以后我应该把这个密码存储在哪里呢?仅仅将其存储在静态公共变量或应用程序对象中就足够了吗 编辑:这是一个数据库密码为什么在整个会话期间需要密码?创建cookie或会话值,并在用户登录时设置标志。然后,您可以使用此值检查用户是否已登录。为什么在整个会话期间需要密码?创建cookie或会话值,并在用户登录时设置标志。然后,您可以使用此值检查用户是否已登录。将其存储在应用程序对

我的asp.net web应用程序正在Global.asax的App_start event中读取和解密XML文件中的密码。但是以后我应该把这个密码存储在哪里呢?仅仅将其存储在静态公共变量或应用程序对象中就足够了吗


编辑:这是一个数据库密码

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

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

将其存储在
应用程序
对象中。由于您是在
Global.asax
中的
Application\u Start
事件中执行此操作的,因此无论何时您需要它,它都可以用于整个应用程序。此外,通过将其存储在
应用程序
对象中,您不会使用cookie、viewstate等将其公开给客户端

// set it
Application["MyPassword"] = myDecryptedPassword;
并在应用程序的其他位置检索:

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

将其存储在
应用程序
对象中。由于您是在
Global.asax
中的
Application\u Start
事件中执行此操作的,因此无论何时您需要它,它都可以用于整个应用程序。此外,通过将其存储在
应用程序
对象中,您不会使用cookie、viewstate等将其公开给客户端

// set it
Application["MyPassword"] = myDecryptedPassword;
并在应用程序的其他位置检索:

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

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

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

如果您对此非常担心,请在应用程序对象中使用。然而,我不得不警告您,配置文件中的加密密码是维护的噩梦。您应该重新考虑将其以纯文本形式存储在web.config中,并简单地拒绝除系统管理员和asp.net工作进程用户(可能是网络服务)之外的所有人访问web.config文件。

如果您对此感到担心,请在应用程序对象中使用。然而,我不得不警告您,配置文件中的加密密码是维护的噩梦。您应该重新考虑将其以纯文本形式存储在web.config中,并简单地拒绝除系统管理员和asp.net工作进程用户(可能是网络服务)之外的所有人访问web.config文件。

您可以将密码存储在应用程序对象中


但是,我个人的偏好是向全局类添加公共静态属性以访问应用程序级数据。这将为您提供Intellisense支持,为您提供类型安全性(例如,您可能会“意外地”用其他类型的数据覆盖应用程序对象中的密码),并使以后维护应用程序更容易。

您可以将密码存储在应用程序对象中


但是,我个人的偏好是向全局类添加公共静态属性以访问应用程序级数据。这将为您提供Intellisense支持,为您提供类型安全性(例如,您可能会“意外地”用另一种类型的数据覆盖应用程序对象中的密码),并使以后维护应用程序更容易。

SecureString是您需要的

永远不要使用简单的字符串对象,因为它不是加密的,可以经受不同的垃圾收集,这意味着您的密码将在很长一段时间内在内存中四处飞扬,您将无法控制它,除非您动态分配GB生成,这可能非常有害。而SecureString在不再使用时会自动删除

另一方面,在web.config中存储密码时,始终对其进行加密。您可以为此使用aspnet_regais.exe。(它是.NET Framework工具的一部分)

因此,假设您将密码存储在一个名为“DBAccessPassword”的xml元素中,则加密命令将如下所示

aspnet_regiis.exe -pe "DBAccessPassword" -app "/yourApp"
这是一种非常有用的技术,例如,如果您的应用程序易受攻击,它可能会真正起作用。加密密码始终是一个好主意,因为它为应用程序增加了额外的安全层

性能

默认情况下,aspnet_regiis使用RSA。RSA它是一种非对称算法,因此,根据检索密码的时间长短,它可能会导致性能问题。对称密钥算法通常比非对称密钥算法计算量小得多。实际上,非对称密钥算法通常比对称密钥算法慢数百到数千倍


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

< Stult> ScReScult是您正在寻找的。 永远不要使用简单的字符串对象,因为它不是加密的,可以经受不同的垃圾收集,这意味着您的密码将在很长一段时间内在内存中四处飞扬,您将无法控制它,除非您动态分配GB生成,这可能非常有害。而SecureString在不再使用时会自动删除

另一方面,在web.config中存储密码时,始终对其进行加密。您可以为此使用aspnet_regais.exe。(它是.NET Framework工具的一部分)

因此,假设您将密码存储在一个名为“DBAccessPassword”的xml元素中,则加密命令将如下所示

aspnet_regiis.exe -pe "DBAccessPassword" -app "/yourApp"
这是一种非常有用的技术,例如,如果您的应用程序易受攻击,它可能会真正起作用。加密密码总是一个好主意,因为它为您增加了一层额外的安全性