存储“秘密”、密钥库、HSM 等

信息安全 密码学 加密 密钥管理 爪哇
2021-08-20 22:09:37

过去几天我一直在研究敏感数据的存储。如果我将这些数据存储在数据库中,我相信普遍接受的做法是存储敏感数据加密,出于各种原因超出了这个问题的范围。

然而,加密数据意味着我必须管理这些数据的“秘密”。我已经看到了 2 条主要路径(在 Java 世界中),KeyStores 或 HSM。我的第一个问题是,还有其他有效的替代方案(在 Java 世界中)吗?

我可以在 java 中使用多种密钥库格式,仅举几例:

  • jks
  • 杰克斯
  • pkcs12
  • bks
  • 超级

我很少看到有关密钥库安全性的信息。我一直在想,如果我访问密钥库,并且当我查看 java API 时,因为所有密钥库都受密码保护,我可以简单地暴力破解密钥库,无论它有多安全。然后第二个问题变成了,由于密钥库与加密数据位于不同的系统上并且由于它们受密码保护,因此这是普遍接受的做法,那么这对于现实生活条件来说“足够安全”了吗?将密码存储到密钥库怎么办?那里有任何公认的做法吗?例如,将其存储在另一个系统中?在应用程序启动时手动输入?将它放在一个受操作系统保护的文件中,只有应用程序可以读取它?

下一个问题是关于 HSM。既然我可以暴力破解密钥库,那么是什么阻止我对 HSM 做同样的事情呢?时间?由于没有文件可供我远程复制和使用,因此必须登录到远程系统?

最后一个问题是,是否有人知道在秘密管理方面什么是足够安全的?我认为它会根据使用秘密加密的信息类型而有所不同。从我在其他地方读到的内容来看,对于大多数典型场景来说,密钥库似乎已经足够好了,而在非常小众的场景中,对于 CA、政府等来说,HSM 是必要的。

任何见解表示赞赏。

1个回答

从广义上讲,密钥存储只是存储密钥和元数据的不同“格式”。据我所知,它们之间没有任何重大的安全差异。将其视为类似于将图像编码为 Jpeg、PNG 或 GIF 的东西。细微的差异,但最终它们存储图像。

您正确地选择了一般密钥管理问题的一部分,并希望您开始理解为什么它可能会变得复杂。所以你有一个用密钥加密的数据,密钥存储在密钥库中,用密码保护,密码存储......你知道这是怎么回事吗?在这条链的末端,有一些相对较小的信息,如果你获得它——你几乎可以打破整个链。这可能会让您访问所有数据。同样,即使您解决了这个特定问题,也需要使用加密/解密/签名的密钥. 即加载到使用它来管理数据的程序中。当它被加载到内存中时,CPU 可以通过某种方式访问​​它,并且可能还有其他运行在同一系统上的程序可以访问它。如果其中一个被泄露,您的密钥可以从内存中提取。即使它以加密形式存储。

这或多或少是 HSM 的用武之地。没有 HSM,您在安全存储密钥的能力方面受到限制,并且在不暴露密钥的情况下在内存中执行加密操作的能力也受到限制。HSM 将密钥“隐藏”在(通常是物理保护的)存储中,并在此受保护区域内执行加密操作。它们以防止其他程序或操作系统访问的方式运行。所有这些看到的是这个 HSM 的输入/输出。HSM 在提供的保证级别方面也各不相同。FIPS-140是涵盖不同程度的保证/弹性的标准之一。一些 HSM 还为您提供一定程度的密钥管理/授权。例如,他们可以只“授予”某些用户加密,但其他用户也可以解密数据。它们可以限制每个用户/组的加密操作次数,并且可以配置为在多次尝试失败后锁定。这是任何密钥库都无法做到的。

因此,尽管您正确地注意到密钥库(和内存中的加密操作)通常“足够好”。在某些情况下,最好使用更安全的东西。这完全取决于数据的价值、当前保护的感知水平、仅使用软件、使用 HSM 或其他工具的额外保护成本,以及该数据的威胁概况(谁想要它,他们的能力如何,他们将投入多少资金来做这件事等)。