【问题标题】:Best method for securely storing passwords安全存储密码的最佳方法
【发布时间】:2013-01-18 17:37:39
【问题描述】:

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

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

【问题讨论】:

  • 请使用回答问题按钮发布答案,而不是在 cmets 中。
  • 呃,不!那是一个链接。点击它很容易......
  • 您已经回答了自己的问题。在注册表中加密。完成。
  • 提问者需要实际密码。如果他只需要根据用户提供的密码检查密码,那么哈希就可以了。由于他需要使用密码才能在线登录,因此哈希不起作用。

标签: c# .net encryption cryptography


【解决方案1】:

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

托管类ProtectedData使用这些功能,所以可以从C#中使用。

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

根据附加要求进行扩展:

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

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

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

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

【讨论】:

  • 我的程序不应该需要管理员权限来打开密码文件...而且这只能通过程序访问。
  • Windows 的权限模型不支持这个。如果您的程序无需获得额外权限即可访问它,那么以同一用户身份运行的任何程序都可以访问它。
  • 我添加了一个指向 C# 示例的链接。
  • 最接近的方法是使用“二级熵”功能,它将对密码执行额外的加密。然后,您可以将此辅助密钥存储在您的应用程序中。不幸的是,任何人都可以轻松地对您的应用程序进行逆向工程并检索您使用的密钥,因此这只会稍微混淆密码。
  • ProtectedData 类是 DPAPI 的托管包装器,不需要使用 p/invoke...(除非您使用的是低 .net 版本)msdn.microsoft.com/en-us/library/…
【解决方案2】:

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

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

【讨论】:

  • 问题在于,这只会将问题转移到您想要存储 AES 密钥的位置。这个问题没有很好的解决方案,但是ProtectedDataCurrentUser 保护范围最接近。用 AES 自己构建东西可能不是一个好主意。
  • 我可能会将密钥硬编码到程序中。这是不安全的吗?如果程序被反汇编,是否有人能够找出密钥?
  • 我要调查一下。我将对 AES 进行一些研究,看看会发生什么。
  • @PhoenixLogan 是的,这并不比我上面详述的“二级熵”特性好,实际上更糟糕的是,它不使用用户登录来保护存储在硬盘上的数据。
  • 我不担心其他用户能够获得这些信息,更重要的是任何程序都可以访问这些信息。间谍软件和密码不能混用。
猜你喜欢
  • 2012-06-23
  • 2010-12-08
  • 1970-01-01
  • 2011-02-03
  • 2013-02-11
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多