问题在于:我需要确保在完成某些数据加密后,无法从应用程序内存中提取密码/派生密钥(现有密码/密钥已被覆盖)。我知道这不是一件容易的事。我想我仍然可以在我自己实现的应用程序的核心部分中完成它。
但是对外部库的调用如实现JCA / JCE的那些调用我不能没有加密(让我们说Bouncy Castle)。我有多确定该库不会创建我一无所知的克隆或其他对象,这可能会在有人转储内存以便离线分析后显示密码。
我可以告诉图书馆清除它一直使用的内存吗?或者也许有其他方法可以解决这个问题?
答案 0 :(得分:1)
目前不可能,如果没有平台支持,你就无法做到这一点。 Java堆使用的内存可以换出,内存可以在不擦除的情况下回收。可以复制内存并更改引用等。
对于更短的时间范围,您可以在字节数组和字符数组上执行此操作(以不可测试的方式),但即便如此,您也可能遇到麻烦。
因此,唯一的方法是使用具有本机支持的(FIPS认证的)JCE提供程序(或其他专有API)。本机代码可以是(FIPS认证的)软件库,用于清理密钥材料。或者它可以连接到与您的对称算法和/或密钥派生方法兼容的硬件安全模块(HSM)或其他硬件设备(智能卡或TPM)。