0

我正在编写一个 winforms 应用程序,它将用户名和密码本地存储在配置文件中,这样使用该应用程序的人就不必在每次登录到我的应用程序支持的各种服务时重新输入他们的凭据。密码能够被解密是绝对必要的,所以我选择使用 ProtectedData 以及 Protect 和 Unprotect 方法来安全地存储密码。这使得保护他们的数据的责任很容易转嫁给 Windows 和最终用户,而不用担心密钥之类的问题。

现在我想为用户提供在安装之间移动设置的能力。一个很好的例子是,如果他们希望保留许多不同帐户设置的备份,或者他们想移动到另一台计算机。

我已经解决了它是这样的:

  1. 用户点击“导出账户”按钮
  2. 应用程序使用 Unprotect 解密存储的设置
  3. 应用程序将设置写入明文“备份”,然后将其导入新帐户并重新加密。

在第 3 步之前,所有这些听起来都很棒。第 3 步让我很困扰,因为它将密码以明文形式放置。在这种情况下是否有导入/导出凭据的最佳实践,或者被认为“可以”让用户有责任保护导出的文件?对我来说,假设用户正确保护了他们的 Windows 帐户,这似乎是可以假设的。我已经提出了不允许他们导入/导出设置文件的想法,但这似乎是一个很大的不便。同样,我也可以构建一个极其罕见的极端情况,即某人拥有如此多的存储帐户,以至于手动重新输入只需不到十年的时间。

如果有做这件事的经验的人愿意为此提供最佳实践/建议,我将不胜感激。对于必须处理存储凭据的所有复杂性,我还是很陌生。

4

1 回答 1

1

如果有足够的时间和空间,您的本地密钥存储可能会受到影响,我们所做的只是让这变得更加困难。

当我使用 DPAPI 在域中的多台计算机上进行类似的数据保护时,我唯一的方法就是您现在所在的位置。将敏感数据取消保护为纯文本。将它们复制到另一台计算机,然后使用 DPAPI 保护数据。这看起来不太好,所以我放弃了导出数据的选项!并提供了另一种加密方案,允许以安全的方式导出敏感数据。

这可能不是您问题的答案,但是在导出加密数据时,使用 DPAPI 让您别无选择,只能拥有您所拥有的,这是设计使然。

推荐的做法是使用对称算法(如 Rijndael)来加密数据。使用非对称算法加密对称算法的密钥。稍后,将非对称算法的公钥/私钥对和加密的对称算法的密钥保存在 lccly 中。将它们导出到另一台计算机。使用非对称算法的私钥解密加密的对称算法的密钥。然后使用对称密钥解密导出的数据。

把事情放在透视图中,当你导出时:

  1. 使用RijndaelManaged对原始数据进行加密。
  2. 通过使用RsaCryptoServiceProvider加密来保护 RijndaelManaged 使用的密钥。
  3. 当您保留 RSA 公钥/私钥对时,请确保使用CspParameters
  4. 使用ToXmlString将 RSA 公钥/私钥对导出到 XML 文件
  5. 将步骤 2 中加密的密钥,步骤 4 中创建的 RSA 密钥对,原始加密数据复制到另一台计算机。
  6. 使用FromXmlString从 XML 字符串导入 RSA 公钥/私钥对。清除 Xml 文件容器公钥/私钥对。
  7. 现在您的私人(和公共)密钥在您的新计算机中可用,使用它来解密 RijndaelManaged 的​​密钥。
  8. 获得 RijndaelManaged 的​​密钥后,使用它来解密原始数据。

现在这应该足以满足您的情况。使用 DPAPI 进行常规凭据存储是您的权衡,当用户需要将凭据导出到另一台计算机时,您可以按照上面列出的步骤 1 到 8 进行操作。

虽然在本地存储凭据不是一个好习惯,但有时为了用户体验,我们别无选择,只能增加加密的复杂性。

使用 DPAPI 时,请务必配置用户级/机器级保护,这也是一个熵值。

于 2012-09-06T18:32:12.897 回答