.net 存储用于针对另一个系统进行身份验证的密码

.net 存储用于针对另一个系统进行身份验证的密码,.net,security,passwords,dpapi,.net,Security,Passwords,Dpapi,这不是常见的问题“存储纯文本用户的密码安全吗?”。不,这不安全,我们都知道 我正在编写一个小应用程序,它应该通过外部系统进行身份验证来完成一些工作,唯一可用的身份验证方法是通过用户名和密码。它是为人类设计的,不能改变 有多个用户可以访问我的应用程序,并且每个用户都单独进行身份验证,但是他们都“共享”针对外部系统的相同身份验证数据,理想情况下,外部系统由应用程序透明管理 “哑”解决方案是以明文形式存储用户名/密码,并将其用于身份验证,但显然这并不安全。密码可以加密,但如果有人闯入系统怎么办 可能的

这不是常见的问题“存储纯文本用户的密码安全吗?”。不,这不安全,我们都知道

我正在编写一个小应用程序,它应该通过外部系统进行身份验证来完成一些工作,唯一可用的身份验证方法是通过用户名和密码。它是为人类设计的,不能改变

有多个用户可以访问我的应用程序,并且每个用户都单独进行身份验证,但是他们都“共享”针对外部系统的相同身份验证数据,理想情况下,外部系统由应用程序透明管理

“哑”解决方案是以明文形式存储用户名/密码,并将其用于身份验证,但显然这并不安全。密码可以加密,但如果有人闯入系统怎么办

可能的解决方案:使用DPAPI透明地加密/解密密码(甚至用户名)。这是个好主意吗?这安全吗?多台机器的设置如何(机器之间是否兼容加密)


您还有其他建议吗?

DPAPI通常不能在web场中使用-密钥存储是特定于机器的。您没有指定某些用户是否共享一组凭据,而另一个用户是否共享另一组凭据。如果所有用户共享同一组凭据,请将其存储在web.config中,然后使用它。使用web.config文件上的配置加密API或简单ACL保护凭据


如果不同的用户具有不同的第三方系统凭据,我将使用用户密码的散列+一个salt作为加密密钥与用户一起存储凭据。然后,即使恶意用户获取了您的数据库,他们也必须能够在尝试破解第三方密码之前先解密您用户的密码。salt为这样做增加了额外的一层困难。

DPAPI通常不能用于网络农场-密钥存储是特定于机器的。您没有指定某些用户是否共享一组凭据,而另一个用户是否共享另一组凭据。如果所有用户共享同一组凭据,请将其存储在web.config中,然后使用它。使用web.config文件上的配置加密API或简单ACL保护凭据


如果不同的用户具有不同的第三方系统凭据,我将使用用户密码的散列+一个salt作为加密密钥与用户一起存储凭据。然后,即使恶意用户获取了您的数据库,他们也必须能够在尝试破解第三方密码之前先解密您用户的密码。salt增加了额外的一层难度。

请记住,DPAPI密钥位于用户级别。除非您要为每个用户设置和存储单独的凭证集副本,否则DPAPI不会对您有任何好处。要做到这一点,唯一真正安全的方法是使用“受信任的子系统”模型,在该模型中,您以某个用户的身份运行Windows服务,并使用该用户的DPAPI密钥加密该用户的HKCU配置单元中存储的受保护数据。它代表用户对需要身份验证的系统执行所有操作,并且用户名/密码不会加载到用户的进程中。即使这样,如果用户是管理员,从技术上讲,他们仍然可以通过调试服务流程获得用户名/密码


真正安全的方法是做同样的事情,但是远程使用Windows凭据将用户授权到代表用户执行操作的远程服务器。实际上,这取决于用户名/密码的安全性。

请记住,DPAPI密钥在用户级别。除非您要为每个用户设置和存储单独的凭证集副本,否则DPAPI不会对您有任何好处。要做到这一点,唯一真正安全的方法是使用“受信任的子系统”模型,在该模型中,您以某个用户的身份运行Windows服务,并使用该用户的DPAPI密钥加密该用户的HKCU配置单元中存储的受保护数据。它代表用户对需要身份验证的系统执行所有操作,并且用户名/密码不会加载到用户的进程中。即使这样,如果用户是管理员,从技术上讲,他们仍然可以通过调试服务流程获得用户名/密码


真正安全的方法是做同样的事情,但是远程使用Windows凭据将用户授权到代表用户执行操作的远程服务器。实际上,这取决于用户名/密码的安全性。

您需要保持纯文本用户名和密码可用于登录外部系统。您可以自己尝试加密此文件,然后在应用程序中以某种方式隐藏密钥

但是,您的操作系统(如Windows)可能确实提供了保护文件的方法,而且这些方法可能是由经验丰富的专家实施的-很难建议您投入时间来保护自己的文件

因此,最好的方法是将您的凭据存储为纯文本,并依靠操作系统来保护文件

  • 加密的主目录,其中您的web服务器作为自己的用户运行,因此只有它才能获取其数据
  • 全磁盘加密
如果机器/服务是无人值守的,则需要考虑如何在启动时“登录”

这个问题本身包含在安全免责声明中,因此这一点不需要赘述

  • 它将阻止空闲的对等方访问服务器上的终端
  • 它不会阻止专用攻击者访问正在运行的机器和物理设备(从firewire和usb设备到冷却液攻击基本上都无法防御)
  • 它无法阻止这些凭证在fl中受到攻击