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

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


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

您如何保护kek

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

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

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

我听说过“软件HSM”。他们使用什么技术使人难以置信,从而使他们存储的密钥安全?

最佳答案

如果要真正保护加密密钥,则必须使用硬件安全模块(HSM)。这些是可以安全存储密钥的物理设备。您可以here详细了解它们。

在当前情况下,您将使用该软件(在这种情况下为Java)生成加密密钥,并且还将对该软件执行加密操作(加密/解密)。但是,当您使用HSM时,您实际上将在硬件上生成并存储密钥,并且将对硬件本身(而不是软件)执行加密操作。并且您需要做很多配置才能使软件与硬件对话。因此,进入HSM并查看密钥并不容易。这只是使用HSM的高级方法。 PKCS#11 API通常用于与硬件进行交互。您可以here详细了解。

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

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

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

可以提高安全性的一种方法是混淆执行这些关键操作的代码。甚至混淆也可能破裂,但这很耗时间,而且难度更大。

10-07 16:12