C# 安全存储密码的最佳方法

C# 安全存储密码的最佳方法,c#,.net,encryption,cryptography,C#,.net,Encryption,Cryptography,在计算机上保存密码使其无法访问的最佳方法是什么?我想将它们加密存储在注册表中。我希望您能够重置密码,但这不适用于服务器。这是为了将它们存储在计算机上,以便记住它们并自动登录 重要编辑:我需要能够从程序中检索纯文本密码,而不是从其他任何地方。这是您在Windows上的最佳选择。它们使用登录凭据加密数据,因此密码不会受到磁盘攻击。但是,在同一用户下运行的任何程序都可以访问它们。我建议将它们存储在一个文件中,该文件的权限会阻止其他程序访问它们(例如需要管理员权限才能访问的文件) 托管类使用这些函数,因

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

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

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

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

您还可以使用p/Invoke直接使用这些函数。有一些示例代码正是这样做的

根据额外要求进行扩展:

有一种方法可以确保您的程序是唯一一个能够访问密码的程序,而无需以管理员权限启动您的程序,尽管这需要做更多的工作

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

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


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

我相信我正在寻找的是AES。这似乎是存储密码的一种简单方法。当然,这只是为了记住计算机上的密码,这样用户就不必键入密码


请使用“回答问题”按钮发布答案,而不是在评论中。呃,不!这是一个链接。点击它很容易…你已经回答了你自己的问题。在注册表中加密。完成。询问者需要实际密码。如果他只需要对照用户提供的密码检查密码,哈希就可以了。由于他需要使用密码才能在线登录,哈希将无法工作。我的程序不需要管理员权限才能打开密码文件。。。而且这只能通过程序访问。Windows的权限模型不支持这一点。如果您的程序可以访问它而无需获得额外的权限,那么以同一用户身份运行的任何程序都可以访问它。我添加了一个指向C#示例的链接。最接近的方法是使用“二次熵”功能,它将对密码执行额外的加密。然后,您可以将此辅助密钥存储在应用程序中。不幸的是,任何人都可以轻松地对您的应用程序进行反向工程并检索您使用的密钥,因此这只会稍微混淆密码。ProtectedData类是DPAPI的托管包装,不需要使用p/invoke。。。(除非您使用的是低.net版本)问题在于,这只会将问题转移到您希望存储AES密钥的位置。对于这个问题没有很好的解决方案,但是
ProtectedData
CurrentUser
的保护范围最接近。用AES自己构建一些东西可能不是一个好主意。我可能会将密钥硬编码到程序中。这不安全吗?如果程序被反汇编,有人能找出钥匙吗?我会调查一下。我会对AES做一些研究,看看会发生什么。@PhoenixLogan是的,这并不比我上面详述的“二次熵”功能好,实际上更糟,因为它不使用用户的登录来保护存储在硬盘上的数据。我不担心其他用户能够获得信息,更重要的是,任何程序都可以访问这些信息。间谍软件和密码不能混用。