从java中的内存中删除安全数据

时间:2012-03-24 23:21:57

标签: java security

我正在用java编写一个我关心的安全应用程序。加密字节数组后,我想强行从内存中删除任何有潜在危险的内容,例如使用的密钥。在以下代码段中,keybyte[]data也是如此。

SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encData = cipher.doFinal(data, 0, data.length);
Arrays.fill(key, (byte)0);

据我所知,上面的最后一行用0覆盖了密钥,使其不再包含任何危险数据,但我找不到一种方法来覆盖或逐出密码或密码。

有没有办法强行覆盖secretKeySpeccipher所占用的内存,这样如果有人能够查看当前的内存状态(比如通过冷启动攻击),他们无法访问这些信息?

1 个答案:

答案 0 :(得分:0)

你想要做旧C的道德等同:

bzero( static_cast<char>(secretKeySpec), sizeof(SecretKeySpec) )

在现代C中,memset。

(假设它在编译时已知一个固定大小的对象)。

如果Java不提供工具,则链接到C,C ++或程序集中的本机代码。

Ditto cipher。

警告:可能违反数据结构属性,例如中断finalize。此外,假设对象是连续的,而不是链接的数据结构。