Java 密钥安全-如何确保密钥安全?

Java 密钥安全-如何确保密钥安全?,java,security,secure-coding,Java,Security,Secure Coding,假设有一个密钥加密密钥存在于内存中,并且没有写入文件或数据库 byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[] kekHash = SHA512.hash(kek); 以及假设密钥加密密钥是短暂的,并且数据加密密钥可能是也可能不是短暂的 您如何保护kek 如何确保从不将kek写入虚拟内存 如何确保另一个应用程序(例如CheatEngine)不读取kek 如何确保应用程序生成kek,并且kek和kekHash不会被另一个

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

byte[] kek = new byte[32];
secureRandom.nextBytes(kek);
byte[] kekHash = SHA512.hash(kek);
以及假设密钥加密密钥是短暂的,并且数据加密密钥可能是也可能不是短暂的

您如何保护kek

如何确保从不将
kek
写入虚拟内存

如何确保另一个应用程序(例如CheatEngine)不读取
kek

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


我听说过“软件HSM”。他们使用了什么技术使他们存储的密钥变得安全?如果你想真正保护你的加密密钥,你必须使用硬件安全模块(HSM)。这些是可以安全存储密钥的物理设备。你可以阅读更多关于他们的信息

在您当前的场景中,您将使用软件生成加密密钥(本例中为java),并且还将对软件执行密码操作(加密/解密)。但是,当您使用HSM时,您实际上是在硬件上生成并存储密钥,并且您将在硬件本身上执行密码操作,而不是在软件上执行密码操作。为了让你的软件和硬件对话,你需要做很多配置。因此,进入HSM并查看钥匙并不容易。这只是您将如何使用HSM的一个较高级别。PKCS#11 API通常用于与硬件交互。你可以阅读更多关于它的内容

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

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

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


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

您好,我感谢您给出的答案。我有使用HSMs的经验,但目前正在寻找一种软件解决方案,也许还有一些令人兴奋的方法来保护密钥加密密钥。此外,虽然我很欣赏您的模糊处理建议,但我必须说,将ProGuard与Java或其他商用模糊处理程序结合使用是相当标准的。更重要的是,根据Kirchoff的原则,假设对手对系统有完善的了解,但密钥的价值除外,通过代码/系统的模糊性/保密性实现的安全性是不可接受的。