如何允许导入/导出DPAPI安全凭证

时间:2012-08-29 03:42:53

标签: c# encryption import export dpapi

我正在编写一个winforms应用程序,用于在配置文件中本地存储用户名和密码,以便使用该应用程序的人员每次登录我的应用程序支持的各种服务时都不必重新键入其凭据。密码必须能够解密,因此我选择使用ProtectedData以及Protect和Unprotect方法来安全地存储密码。这样就可以轻松地将保护数据的责任传递给Windows和最终用户,而不是担心密钥等问题。

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

我已经做到了这样的事情:

  1. 用户点击“导出帐户”按钮
  2. 应用程序使用Unprotect
  3. 解密存储的设置
  4. 应用程序将设置写入明文“备份”,然后在新帐户中导入并重新生成。
  5. 所有这一切听起来都很好,直到第3步。第3步困扰我,因为它将密码放在明文中。在这种情况下是否存在导入/导出凭证的最佳实践,或者将其视为“好”以使用户有责任保护导出的文件?对我来说,假设用户正确地保护他们的Windows帐户,这似乎可以假设。我已经提出了甚至不允许他们导入/导出设置文件的想法,但这似乎是一个很大的不便。同样地,我也可以建立一个非常罕见的边缘情况,有人拥有如此多的存储账户,手动重新输入需要不到十年的时间。

    如果有任何有这方面经验的人会为此提出最佳实践/建议,我会非常感激。我不得不处理存储凭证的所有复杂问题。

1 个答案:

答案 0 :(得分:1)

  

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

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

这可能不是您问题的答案,但在导出加密数据时,使用DPAPI让您别无选择,只能按设计进行操作。

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

在出口时把事情放在说明中:

  1. 使用RijndaelManaged加密原始数据。
  2. 使用RsaCryptoServiceProvider加密来保护RijndaelManaged使用的密钥。
  3. 当您保留RSA公钥/私钥对时,请务必使用CspParameters
  4. 使用ToXmlString
  5. 将RSA公钥/私钥对导出到XML文件
  6. 将步骤2中加密的密钥,即步骤4中创建的RSA密钥对,原始加密数据复制到另一台计算机。
  7. 使用FromXmlString从XML字符串导入RSA公钥/私钥对。清除Xml文件容器公钥/私钥对。
  8. 现在你的私人(和公共)密钥在新计算机上可用,用它来解密RijndaelManaged的密钥。
  9. 获得RijndaelManaged密钥后,使用它来解密原始数据。
  10. 现在这应该足以满足您的需求。使用DPAPI进行常规凭据存储是一种折衷方式,当用户需要将凭据导出到另一台计算机时,您可以按照上面列出的步骤1到8进行操作。

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

    确保在使用DPAPI时配置用户级/机器级保护,也是熵值。