如何临时但安全地存储 IV 和密钥

信息安全 加密 应用安全 密钥管理 。网
2021-09-09 15:23:12

我正在使用 .NET 4.0 开发 Windows 服务,该服务将在数据库中临时存储加密数据。数据在插入时将被加密,然后在处理后解密、处理和删除。这可能会作为一个批处理过程(一次数千行)来完成。

我在 MSDN 上查看了为加密和解密生成密钥,看起来我可以使用 TripleDES 对称加密(我正在考虑使用 RijndaelManaged 类)。

但是,如果服务失败或者我在加密和插入数据时丢失了数据库连接,我希望能够使用相同的 IV 和密钥从中断的地方继续。

我应该如何在本地计算机上存储我的 IV 和密钥?我想确保它不会被发现并用于解密数据库的加密内容。

2个回答

至少有一件事你可以很容易地改进:你可以简单地将 IV 存储在加密数据旁边的数据库中。IV 本身不应该是秘密的。它通常充当盐,以避免两个相同的明文记录被加密为相同的密文的情况。将每行的 IV 存储在数据库中将消除对丢失这些数据的担忧。理想情况下,每一行 IV 都是唯一且随机的,但不是秘密的。

这使您的问题在于存储相对较小的信息:key就安全性而言,对所有记录使用相同的密钥应该没有问题。只要密钥本身很强大,使用不同的密钥不会给您带来任何优势(实际上,管理起来会很头疼),所以通常一个密钥就足够了。

可能有许多安全存储密钥的解决方案,但这些取决于您真正需要的安全级别。对于 .NET / Microsoft 环境,我猜您应该查看DPAPI,尽管可能有更好的选择。在一个极端情况下,您需要HSM或智能卡,但在不太严格的环境中,将密钥存储在具有正确权限的文件系统上可能就足够了。这完全取决于您的风险状况和威胁。

如果我正确理解您的情况:

  1. IV 应与加密数据一起存储在数据库中(连接在同一字段中,或在同一行中的单独字段中)。这可以作为明文存储,它的保密性没有任何价值。
  2. 加密密钥应该存储在任何文件或注册表项中,只要它不能远程访问,有两个限制:强 ACL,限制仅由应用程序(和管理员)访问此文件;它本身应该在保存之前进行加密。

关于最后一点,请注意仍然需要保护 KEK(密钥加密密钥)......为此,DPAPI(数据保护 API)非常适合大多数情况(尽管在某些情况下您可能需要考虑某种形式的硬件模块),可能在 USER_MODE。.NET 使您可以通过和
轻松访问。ProtectedMemoryProtectedData