最佳安全存储密码的方法是什么?

4

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

重要编辑:我需要能够从程序内部检索明文密码,但不能在其他地方检索。


2
https://dev59.com/EHNA5IYBdhLWcg3wNa6T - Mitch Wheat
不,那是一个链接。点击它非常容易... - Mitch Wheat
2
你已经回答了自己的问题。在注册表中加密。完成。 - Simon Whitehead
2
提问者需要真正的密码。如果他只需要检查用户提供的密码,那么哈希函数可以工作。由于他需要使用密码在线登录,哈希函数将无法工作。 - John Colanduoni
@PhoenixLogan 我更新了我的答案,并提供了解决您问题的方法。虽然它相当复杂,但这是添加Windows本身无法识别的权限的唯一方法。 - John Colanduoni
显示剩余2条评论
2个回答

3

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

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

您还可以使用P/Invoke直接使用这些函数。这里有一些示例代码可以做到这一点here

针对额外要求的拓展:

有一种方法可以确保您的程序是唯一能够访问密码而不需要以管理员权限启动程序的方式,尽管这需要更多的工作。
基本思路是:在安装应用程序时创建一个Windows服务。当应用程序想要存储/检索用户密码时,它应该从应用程序中按需启动该服务。该服务将简单地提供读/写访问权限,文件的权限设置为只有管理员才能读/写。附加的安全性来自于与进程的IPC连接,它将使用Named Pipe。然后,您可以使用GetNamedPipeClientProcessId(抱歉,您需要P / Invoke)通过查找连接到管道的客户端的进程ID来验证请求的身份认证。
根据您对安全性的担忧程度,如果您可以访问有效的证书,则可以使用代码签名来验证进程ID。或者,您可以验证可执行文件的校验和或类似的内容。
这是我能想到的在Windows上创建所需安全性的唯一方法。您的应用程序还应使用ProtectedData对数据进行加密,然后将其交给Windows服务以保护免受硬盘攻击。

我的程序不应该需要管理员权限才能打开密码文件...而且这必须只能通过程序访问。 - Phoenix Logan
2
Windows的权限模型不支持这个。如果您的程序可以在不获取额外权限的情况下访问它,则任何以相同用户身份运行的程序都可以访问它。 - John Colanduoni
我已添加了一个到C#示例的链接。 - John Colanduoni
1
你能做的最接近的方法是使用“次要熵”功能,它将在密码上执行额外的加密。然后,你可以将此次要密钥存储在应用程序中。不幸的是,任何人都可以轻松地反向工程化你的应用程序并检索你使用的密钥,因此这只能稍微混淆密码。 - John Colanduoni
2
ProtectedData类是DPAPI的托管包装器,无需使用p/invoke...(除非您使用低版本的.net) http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx - Matt
@Matt 啊,我之前不知道这个包装器,我已经把它加到答案里了。谢谢! - John Colanduoni

-1

1
问题在于这只是将问题转移到您想要存储AES密钥的位置。对于这个问题,没有很好的解决方案,但使用CurrentUser保护范围的ProtectedData最接近。自己构建AES可能不是一个好主意。 - CodesInChaos
我可能会在程序中硬编码密钥,这样安全吗?如果程序被反汇编,有人能够找出密钥吗? - Phoenix Logan
我会研究一下,看看AES的情况。 - Phoenix Logan
@PhoenixLogan 是的,这比我上面详细介绍的“次要熵”功能更差,实际上更糟糕,因为它不使用用户的登录来保护存储在硬盘上的数据。 - John Colanduoni
我不担心其他用户能否获取信息,更担心的是任何程序都可能访问信息。间谍软件和密码绝对不兼容。 - Phoenix Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接