gpt4 book ai didi

java - 如何清除java.security.Key的内容?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:14 29 4
gpt4 key购买 nike

当您在 Java 应用程序中使用敏感数据时,通常建议您使用原始类型 - 例如使用 char[] 而不是 String ...

但是对于加密 key ,我们通常需要使用 java.security.Key 对象,因为这是 JCE 提供者使用的对象。 key 通常是非常敏感的信息,我们希望能够最大限度地减少可能的攻击窗口 - 即尽可能晚地创建 key 对象,进行加密/解密/签名,然后尽快清除对象.但是 Key 没有提供任何可以促进这种清算的方法。

目前我们这样做的方式是将 key 保存在字节数组中并在使用它之前初始化 Key 对象,Key 立即超出范围以符合垃圾收集条件,我们也会立即清除字节数组.但这似乎不是很优雅……它还在我们的接口(interface)中创建了一个二分法——一些接受字节数组,一些接受 Key 对象,这有点困惑。

我知道 Java 没有提供任何从内存中清除对象的通用机制,但我想问一下是否有专门针对键的机制。或者,是否有其他方法可以最小化 key 的攻击窗口?

谢谢。

最佳答案

升级到 Java 8,其中 SecretKeyRSAPrivateKey工具 Destroyable .但是,快速测试表明这不适用于 AES key 或本地生成的 RSA 私钥。

下面的代码确实有效,但它仅在第二次初始化 (!) 后失败,因此请注意 key 信息可能被缓存(AES 需要子 key 派生,因此子 key 可能会停留在).使用后使用单独的(零) key 重新初始化任何密码可能是个好主意。此外,它不能防止 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 实现了 SecretKeyDestroyable。不过,不要忘记破坏 MyAESKey 的输入。对于 Java 7 及更低版本,您当然可以对自己的 MyDestroyable 接口(interface)使用类似的方法。

我所知道的唯一其他方法是使用使用安全 token (HSM/TPM/智能卡等)的提供商,其中 key 不会离开设备。在那种情况下, key 可能也不会被破坏,但它至少不可用。

使用 native 代码(使用正确类型的内存)的提供商也可能允许销毁关键数据。但即使在 VM 之外,也可能很难确保关键数据不会留在 RAM 或(交换)磁盘中的任何地方。

关于java - 如何清除java.security.Key的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25642911/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com