安全存储密码的最佳方法

时间:2013-02-04 02:31:11

标签: c# .net encryption cryptography

在计算机上保存密码以便无法访问密码的最佳方法是什么?我想将它们存储在加密的注册表中。我希望您能够重置密码,但这不适用于服务器。这是为了将它们存储在计算机上以便记住它们并自动登录。

重要编辑:我需要能够从程序中检索纯文本密码,而不是其他任何地方。

2 个答案:

答案 0 :(得分:3)

CryptProtectDataCryptUnprotectData是您在Windows上最好的选择。他们使用登录凭据加密数据,因此密码可以安全地免受对磁盘的攻击。但是,任何在同一用户下运行的程序都可以访问它们。我建议将它们存储在一个文件中,该文件的权限阻止其他程序访问它们(例如需要管理员权限才能访问的文件)。

托管类ProtectedData使用这些函数,因此可以在C#中使用。

您也可以使用P / Invoke直接使用这些功能。有一些示例代码完全符合here

根据其他要求进行扩展:

有一种方法可以确保您的程序是唯一能够访问密码而无需使用管理员权限启动程序的程序,但这会花费更多的工作。

基本思想是:您创建在安装应用程序时安装的Windows服务。当应用程序想要存储/检索用户密码时,应该根据需要启动它。该服务将简单地提供对具有权限设置的文件的读/写访问权限,以便只有管理员才能读/写它。额外的安全性来自与进程的IPC连接,该进程将使用Named Pipe。然后,您可以使用GetNamedPipeClientProcessId(抱歉,您需要P / Invoke)通过查找连接到管道的客户端的进程ID来验证请求。

根据您对安全性的担忧程度,如果您有权访问有效证书,则可以使用代码签名来验证进程ID。或者,您可以验证可执行文件的校验和或那种性质的校验和。

这是我能想到的唯一方法来创建您在Windows上寻找的安全性。您的应用程序还应使用ProtectedData加密数据,然后再将其交给Windows服务以防止硬盘攻击。

答案 1 :(得分:-1)

我相信我正在寻找的是AES。这似乎是一种存储密码的简便方法。当然,这仅用于记住计算机上的密码,因此用户无需键入密码。

http://en.wikipedia.org/wiki/Advanced_Encryption_Standard