ByteBuffer分配直接的例子

时间:2016-05-26 20:01:48

标签: java jsp byte buffer bytebuffer

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

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

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

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

ByteBuffer pass = ByteBuffer.allocateDirect(2048); 

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

谢谢!

编辑: 在回答第一个答案时 - 我的意思是用' 0'来填充内存。之后的角色,不要释放它。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

作为@ erickson方法的替代方法,如果您自己分配字节数组并通过换行创建$price = (int)session()->get('quantity') * (int)session()->get('pc_cost'); $payer_id = session()->get('paypal_payment_id'); $order = Order::create([ 'user_id' => Auth::User()->id, 'ordered_pc_id' => $ordered->id, 'total_price' => $price, 'deadline' => session()->get('expected'), 'quantity' => session()->get('quantity'), 'payer_id' => $payer_id, 'status' => 0, 'notes' => session()->get('notes'), ]); ,则可以通过调用ByteBuffer来清除数组。 / p>

Arrays.fill()

只要您保留对byte[] byteArray = new byte[2048]; ByteBuffer bb = ByteBuffer.wrap(byteArray); //... do your thing here Arrays.fill(byteArray, (byte)0); byteArray的引用,垃圾回收就不会触及字节数组。您也可以稍后通过调用ByteBuffer然后将其归零来获取阵列。 (注意:如果您使用ByteBuffer.array()创建的ByteBuffer进行尝试,则无法保证实际数组。)