如何清除java.security.Key的内容?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何清除java.security.Key的内容?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1799字,纯文字阅读大概需要3分钟。
内容图文
当您在Java应用程序中使用敏感数据时,通常会建议您使用原始类型 – 例如使用char []而不是String …
但是使用加密密钥,我们通常需要使用java.security.Key对象,因为这是JCE提供者使用的.密钥往往是非常敏感的信息,我们希望能够最小化可能的攻击窗口 – 即尽可能晚地创建密钥对象,进行加密/解密/签名,然后尽快清除对象.但Key没有提供任何能够促成这种清算的方法.
目前我们正在这样做,我们将密钥保存在字节数组中并在使用之前初始化Key对象,Key立即超出范围以便有资格进行垃圾收集,我们也立即清除字节数组.但这看起来并不是很优雅……它还填充在我们的接口中创建了一个二分法 – 一些接受字节数组,一些接受Key对象,这有点混乱.
我知道Java没有提供任何通用的机制来清除内存中的对象,但我问是否有一些专门用于Keys的东西.或者,是否有其他方法可以最小化密钥的攻击窗口?
谢谢.
解决方法:
升级到Java 8,其中SecretKey和RSAPrivateKey实现Destroyable.但是,快速测试表明这不适用于AES密钥,也不适用于本地生成的RSA私钥.
下面的代码确实有效,但它只在第二个init(!)之后失败,因此请注意密钥信息可能被缓存(AES需要子密钥派生,因此子密钥可能会延续).在使用后使用单独的(零)密钥重新启动任何密码可能是个好主意.此外,它不能防止VM本身复制数据,例如,在垃圾收集后的内存压缩期间.
MyAESKey myAESKey = new MyAESKey(new byte[16]);
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, myAESKey);
aes.doFinal("owlstead".getBytes());
myAESKey.destroy();
aes.doFinal("owlstead".getBytes());
aes.init(Cipher.ENCRYPT_MODE, myAESKey);
aes.doFinal("owlstead".getBytes());
MyAESKey同时实现SecretKey和Destroyable.不要忘记销毁MyAESKey的输入.您当然可以在Java 7及更低版本的自己的MyDestroyable界面中使用类似的方法.
我所知道的唯一其他方法是使用使用安全令牌(HSM / TPM /智能卡等)的提供程序,其中密钥不会离开设备.在这种情况下,密钥也可能不会被破坏,但它至少不可用.
使用本机代码(使用正确类型的内存)的提供程序也可能允许破坏密钥数据.但即使在VM之外,也许很难确保关键数据不会留在RAM或(交换)磁盘中的任何位置.
内容总结
以上是互联网集市为您收集整理的如何清除java.security.Key的内容?全部内容,希望文章能够帮你解决如何清除java.security.Key的内容?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。