2012-08-29 36 views
0

我正在编写一个winforms应用程序,该应用程序在配置文件中本地存储用户名和密码,以便使用该应用程序的用户在每次登录时都不必重新键入其凭据我的应用程序支持的各种服务。密码能够被解密是绝对必要的,所以我选择使用ProtectedData和Protect和Unprotect方法来安全地存储密码。这使得将保护他们的数据的责任传递给Windows和最终用户变得容易,而不必担心密钥和我自己。如何允许导入/导出DPAPI安全凭证

现在我想让用户能够在安装之间移动设置。一个很好的例子就是他们希望保留大量不同帐户设置的备份,或者他们想要移动到另一台计算机。

我算出来是这样的:

  1. 用户点击“出口占”按钮
  2. 应用使用解密解除
  3. 应用程序写入设置明文“存储的设置备份“,然后在新帐户中输入并重新输入。

这一切都听起来不错,直到第3步。第3步让我感到困扰,因为它将密码置于纯文本中。在这种情况下是否有导入/导出凭证的最佳做法,或者将其视为“可以”,以使用户有责任保护导出的文件?对我来说,假设用户正确保护他们的Windows帐户,这似乎可以假设。我甚至不曾允许他们导入/导出设置文件,但这似乎是一个很大的不便。同样,我也可以建立一个非常罕见的边缘案例,即有人拥有如此多的存储帐户,以至于在短短的十年内手动重新输入。

如果任何有经验的人做这样的事情会与最佳实践/建议合作,我会很感激。我不得不处理存储凭证的所有复杂问题。

回答

1

在给定足够的时间和空间的情况下,您本地的Keys存储空间可能会受到影响,我们所做的只是让这种存储更加困难。

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

这可能不是您的问题的答案,但是当涉及到导出加密数据时,使用DPAPI会让您别无选择,除非您有什么设计,这就是设计。

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

为了把事情perspectice,当您导出:

  1. 使用RijndaelManaged原始数据进行加密。
  2. 通过使用RsaCryptoServiceProvider对RijndaelManaged进行加密来保护其使用的密钥。
  3. 当您坚持使用RSA公钥/私钥对时,请确保您使用CspParameters
  4. 导出的RSA公共/私有密钥对XML文件使用在步骤2中加密的ToXmlString
  5. 复制键,则在步骤4中创建的RSA密钥对,原始加密的数据到另一台计算机。
  6. 使用FromXmlString从XML字符串导入RSA公钥/私钥对。清除Xml文件容器公钥/私钥对。
  7. 既然您的私人(和公共)密钥在您的新计算机中可用,请使用它来解密RijndaelManaged的密钥。
  8. 一旦你拥有了RijndaelManaged的密钥,就可以用它来解密原始数据。

现在,这应该足够你的情况。这是您使用DPAPI进行常规凭证存储的折衷方法,并且当用户需要将凭证导出到另一台计算机时,您可以按照上面列出的步骤1至8进行操作。

尽管在本地存储证书不是一个好习惯,但有时为了用户体验,我们并没有真正的选择,只是增加了加密的复杂性。

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