我正在用java编写一个我关心的安全应用程序。加密字节数组后,我想强行从内存中删除任何有潜在危险的内容,例如使用的密钥。在以下代码段中,key
是byte[]
,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覆盖了密钥,使其不再包含任何危险数据,但我找不到一种方法来覆盖或逐出密码或密码。
有没有办法强行覆盖secretKeySpec
和cipher
所占用的内存,这样如果有人能够查看当前的内存状态(比如通过冷启动攻击),他们无法访问这些信息?
答案 0 :(得分:0)
你想要做旧C的道德等同:
bzero( static_cast<char>(secretKeySpec), sizeof(SecretKeySpec) )
在现代C中,memset。
(假设它在编译时已知一个固定大小的对象)。
如果Java不提供工具,则链接到C,C ++或程序集中的本机代码。
Ditto cipher。
警告:可能违反数据结构属性,例如中断finalize。此外,假设对象是连续的,而不是链接的数据结构。