ByteBuffer 分配直接示例

ByteBuffer allocate direct example

我正在编写一个 Java 程序,用于存储来自用户的敏感信息。

出于这个原因,我想确保垃圾收集不会触及它,以便将来我完成后可以将其从内存中清除。

到目前为止,这行代码创建了 2048 个字节,足以存储任何用户的密码。

我的问题是如何存储 "secret123" 之类的字符串,并在删除后删除它?这是我知道的一个非常基本的问题,但我在文档中看不到它。我可能让这件事变得比我想象的更困难,但安全总比后悔好。

ByteBuffer pass = ByteBuffer.allocateDirect(2048); 

我知道交换页面文件、计算机受到冷启动攻击等其他风险...

谢谢!

编辑: 作为对第一个答案的回应——我的意思是之后用“0”字符填充内存,而不是释放它。

您不能显式释放分配的内存,但您可以清除缓冲区,然后在完成后将零(或随机字节)写入缓冲区。这将破坏之前存储在缓冲区中的所有数据,从而减少 window 攻击。

pass.clear();
while (pass.hasRemaining())
  pass.put((byte) 0);

作为@erickson 方法的替代方法,如果您自己分配字节数组并通过包装创建 ByteBuffer,那么您可以通过调用 Arrays.fill().[=18 来清除数组=]

byte[] byteArray = new byte[2048];
ByteBuffer bb = ByteBuffer.wrap(byteArray);
//... do your thing here
Arrays.fill(byteArray, (byte)0);

只要您保持对 byteArrayByteBuffer 的引用,垃圾收集就不会触及字节数组。您也可以稍后通过调用 ByteBuffer.array() 然后将其归零来取回数组。 (注意:如果您使用由 allocateDirect() 创建的 ByteBuffer 来尝试此操作,则无法保证实际数组。)