繁体   English   中英

如何在JVM上安全地处理和清零密钥材料缓冲区?

[英]How do I securely handle and zero key material buffers on the JVM?

我正在为执行加密操作的JVM(在Clojure中)编写软件。 具体地,给定秘密输入,秘密密钥,非秘密盐,非秘密个性化,它使用BLAKE2来导出512位密钥材料。 然后,它使用Arrays类中的工具将该Arrays为两个256位块。 来源

该操作的实际实现存在于libsodium中,因此它在C中实现。我正在使用cesium来访问它,这是kalium的包装器, kalium是一个使用jnr-ffi来调用底层C实现的库。

由于上面的所有缓冲区都有敏感的密钥材料,我想确保它从内存中清除。 我不确定如何在JVM上安全地做到这一点(哎呀,我甚至不知道如何在C中安全地做到这一点 )。 鉴于材料是从C const char *为JVM byte[] ,然后我的一些操作产生新的JVM字节数组,关键材料将存在于JVM字节数组中。 这引起了两个问题:

  • 如果我将一个byte[] zerofill,之后没有被任何代码触及,我怎么能确定byte[]实际上是否被清零了? 我假设JVM可以自由地优化它。
  • 即使我能够保证byte[]被清零,我怎么知道JVM没有决定复制该数组(例如在垃圾收集器的上下文中)很多次都没有将原始位置归零,因此无论如何,将密钥材料留在虚拟内存中?

我猜测答案将最终成为“在C&ASM中做到”或甚至“在HSM中做”,但我很想知道是否有JVM-land方法来解决这个问题。

如果只需要清理一个数组,Arrays.fill就不会分配一个新数组,而是更改作为参数传递的值。 如果您下载源代码,可以直接在那里阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM