1

假设有一个密钥加密密钥在内存中并且没有写入文件或数据库......

byte[] kek = new byte[32];
secureRandom.nextBytes(kek);
byte[] kekHash = SHA512.hash(kek);

并假设密钥加密密钥是临时的,而数据加密密钥可能是临时的,也可能不是临时的。

你怎么保护kek

你如何确保kek永远不会写入虚拟内存?

您如何确保kek不被其他应用程序(例如 CheatEngine)读取?

您如何确保kek由应用程序生成kek并且kekHash不被另一个应用程序操纵以使其使用对手的密钥?

我听说过“软件 HSM”。他们使用了哪些令人惊叹的技术来确保他们存储的密钥安全?

4

1 回答 1

2

如果您想真正保护您的加密密钥,您必须使用硬件安全模块 (HSM)。这些是可以安全地存储您的密钥的物理设备。你可以在这里阅读更多关于它们的信息。

在您当前的场景中,您将使用软件(在本例中为 java)生成加密密钥,并且您还将在软件上执行密码操作(加密/解密)。但是,当您使用 HSM 时,您实际上会在硬件上生成和存储密钥,并且您将在硬件本身上执行密码操作,而不是在软件上执行密码操作。您必须进行许多配置才能使您的软件与硬件通信。因此,进入 HSM 并查看密钥并不容易。这只是您如何使用 HSM 的高级别的。PKCS#11 API 通常用于与硬件交互。你可以在这里阅读更多关于它的信息。

这些设备通常采用 3 种主要形式工厂:HSM(与服务器一样大)、USB 令牌、智能卡。这些设备的价格从几百美元到几千美元不等。

因此,对于那些想尝试 HSM 的工作原理,或者如果价格昂贵,或者只是想为他们的项目做一些研发的人,您可以使用 SoftHSM。这意味着,您将像往常一样与硬件交互(使用 PKCS#11)与 SoftHSM 软件交互,但您的密钥实际上存储在软件中。由于 SoftHSM 不是物理设备,因此它是您可以安装在计算机上的软件。密码操作也在软件上完成。将来当您准备好与物理 HSM 集成时,您可以只使用您的 SoftHSM 代码。您可以在此处参考 SoftHSM 文档。

因此,要真正安全地存储您的密钥,您可以使用 HSM。但是当你使用软件时,总会有一个开放的结局。假设即使您有一个超级主密钥来加密您的加密密钥,您也必须将超级主密钥存储在某个地方。通常存储在 Java KeyStore 中。Java KeyStore 受密码保护,您也必须将其存储在某个地方。

您可以实现更高安全性的一种方法是对执行这些关键操作的代码进行混淆处理。即使是混淆也可以破解,但这需要时间,而且难度不大。

于 2017-05-22T14:01:03.540 回答