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);
只要您保持对 byteArray
或 ByteBuffer
的引用,垃圾收集就不会触及字节数组。您也可以稍后通过调用 ByteBuffer.array()
然后将其归零来取回数组。 (注意:如果您使用由 allocateDirect()
创建的 ByteBuffer
来尝试此操作,则无法保证实际数组。)
我正在编写一个 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);
只要您保持对 byteArray
或 ByteBuffer
的引用,垃圾收集就不会触及字节数组。您也可以稍后通过调用 ByteBuffer.array()
然后将其归零来取回数组。 (注意:如果您使用由 allocateDirect()
创建的 ByteBuffer
来尝试此操作,则无法保证实际数组。)