假设密钥加密密钥在内存中而未写入文件或数据库...
byte[] kek = new byte[32];
secureRandom.nextBytes(kek);
byte[] kekHash = SHA512.hash(kek);
假设密钥加密密钥是短暂的,数据加密密钥可能是短暂的,也可能不是短暂的。
你如何保护kek
?
如何确保永远不会将kek
写入虚拟内存?
如何确保其他应用程序(例如CheatEngine)不会读取kek
?
如何确保应用程序生成kek
并且kek
和kekHash
不会被其他应用程序操纵以使其使用对手的密钥?
我听说过“软件HSM”。他们使用了哪些技术,这使得他们存储的密钥安全?
答案 0 :(得分:1)
如果要真正保护加密密钥,必须使用硬件安全模块(HSM)。这些是可以安全存储密钥的物理设备。您可以阅读有关他们的更多信息here。
在您当前的场景中,您将使用软件(在本例中为java)生成加密密钥,并且您还将对软件执行密码操作(加密/解密)。但是当你使用HSM时,你实际上会在硬件上生成和存储密钥,而你将在硬件本身上执行密码操作,而不是软件。您需要为软件与硬件进行通信进行许多配置。因此,进入HSM并查看密钥并不容易。这只是您使用HSM的高级别。 PKCS#11 API通常用于与硬件交互。您可以阅读更多相关信息here。
这些设备通常有三种主要形式:HSM(这些与服务器一样大),USB令牌,智能卡。这些设备可以运行几百到几千美元。
因此,对于那些想要尝试HSM如何工作或者是否负担得起或只是想为他们的项目做一些R& D的人来说,你可以使用SoftHSM。这意味着,您将与SoftHSM软件进行交互,因为您将像往常一样与硬件交互(使用PKCS#11),但您的密钥实际上存储在软件上。由于SoftHSM不是物理设备,因此它是您在计算机上安装的软件。密码操作也在软件上完成。在将来准备与物理HSM集成时,您可以使用SoftHSM代码。您可以参考SoftHSM文档here。
因此,要真正安全地存储密钥,您可以使用HSM。但是当你使用软件时,总会有一个开放的结局。可以说,即使您有一个加密加密密钥的超级主密钥,您也必须将超级主密钥存储在某处。通常存储在Java KeyStore中。 Java KeyStore受密码保护,您也必须将其存储在某个地方。
一种可以提高安全性的方法是让代码进行模糊处理,从而执行这些关键操作。即使混淆也可能会破坏,但现在是时候了,而且更难了。