在 .NET 应用程序中将机密存储在哪里?

信息安全 。网 秘密管理
2021-09-09 16:52:45

我有一些秘密需要从我的 .NET 应用程序转移到另一个应用程序。我正在使用 CNG DPAPI 来加密这些秘密,并且我希望在我的机器上找到最合适的位置来存储它们(以这种加密格式)(我可以从中收集它们并在需要时将它们发送到其他应用程序)。

选项包括: 1) SQL 数据库;2) Windows 注册表;3) 一个文件;4) 一些特定于 Windows 的秘密保险库,我至今无法通过谷歌搜索...

我意识到选项 1-3 具有访问控制机制,但我无法真正确定一种方法相对于另一种方法的优缺点。考虑到这些,最好的选择是什么?

1个回答

Windows 内置的机密存储(类似于 Apple 的密钥环)称为凭据管理器。请参阅https://stackoverflow.com/questions/9221245/how-do-i-store-and-retrieve-credentials-from-the-windows-vault-credential-manage了解有关访问它的(略过时但仍然可用)说明以编程方式。

话虽如此,凭据管理器所做的只是使用 DPAPI 加密您的秘密并将它们存储在结构化数据存储中(我很确定它在注册表中)。由于您自己使用 DPAPI 进行加密,因此凭证管理器给您带来的好处很少,除了可能带来一点便利(尽管 DPAPI 非常方便,大多数存储 API 也是如此)。

就我个人而言,我建议使用 DPAPI 进行加密,然后将机密存储在用户的本地 AppData 文件夹中,在具有程序名称的子目录中(如果机密是机器范围的而不是每个用户的,则可以使用 ProgramData 目录而不是 AppData\本地的,但当然这将使它成为世界可读的)。它与 Windows 中可靠可用的任何其他位置一样安全,在卸载程序时易于删除,并且易于访问。不过,在 Programs\ProgName 下使用当前用户的注册表配置单元也是一种选择。除非你的秘密是某种相互关联的结构化数据,或者你预计会有大量的秘密,否则数据库是毫无意义的。除非您存储的秘密实际上是凭据和/或它,否则我不会打扰凭据管理器


说了这么多,警告几句:

  1. DPAPI 使用每台计算机上不同的每用户加密密钥。如果您将 DPAPI 加密的数据从一台计算机复制到另一台计算机,您将无法在第二台计算机上对其进行解密。
  2. DPAPI 的加密密钥本身是使用从用户密码(除其他外)派生的密钥进行加密的。如果用户通过标准流程(提供旧密码)更改密码,这很好;DPAPI 密钥使用新密码的派生密钥进行解密和重新加密。如果密码被重置(由管理员或通过脱机修改 SAM 数据),DPAPI 密钥将永远丢失。这可能适合您的用例,但您应该知道。
  3. 这个答案中提到的很多东西都是特定于 Windows 的,但 .NET 本身是跨平台的。如果您也希望允许 Mac、Linux 和其他平台运行您的代码,请注意避免使用 Windows 特定的特性和功能。