我正在编写一个有趣的Java程序,用于存储用户的敏感信息。
出于这个原因,我想确保垃圾收集不会触及它,以便将来当我完成时我可以从内存中擦除它。
到目前为止,我有这行代码创建2048字节,这足以存储任何用户的密码。
我的问题是如何存储诸如" secret123"之类的字符串,并在删除之后?这是我知道的一个非常基本的问题,但我在文档中看不到它。我可能比这更让我感到困难,但比抱歉更安全。
ByteBuffer pass = ByteBuffer.allocateDirect(2048);
我知道其他风险,例如交换页面文件,计算机被冷启动攻击等等......
谢谢!
编辑: 在回答第一个答案时 - 我的意思是用' 0'来填充内存。之后的角色,不要释放它。
答案 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
进行尝试,则无法保证实际数组。)