字节缓冲区分配直接示例



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

出于这个原因,我想确保垃圾回收不会碰到它,以便将来当我完成后,我可以从内存中擦除它。

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

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

ByteBuffer pass = ByteBuffer.allocateDirect(2048); 

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

谢谢!

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

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

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

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

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

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

最新更新