我最近在java进程问题上跌跌撞撞,其中可以使用像http://processhacker.sourceforge.net这样的工具来检查运行时应用程序的内存。该工具 - 显示用于在应用程序中进行身份验证的密码。我已经调查了这个问题,密码在使用后似乎已经归零了。我尝试使用Java Mission Control进行堆转储(禁用GC)并查看是否可以检索密码。使用Eclipse Memory Tool我运行了简单的查询,如:
select id, user_id, answers from questions
where answers in (
select max(answers) as answers from questions
where `created` > UNIX_TIMESTAMP()-86400*2
group by user_id
);
order by answers desc
limit 5;
但是这并没有产生任何结果,并且在一小时左右之后密码仍然在进程黑客中可见。如果我在启用GC的情况下执行堆转储 - 进程黑客似乎不再找到密码。
幕后做什么JVM?为什么我无法在实时对象中找到密码?我可以进行某种转储,看看这个密码存储在哪里,是谁创建的,以及为什么没有归零?
答案 0 :(得分:1)
这太具体了,无法回答,但许多密码(特别是JAAS)将使用字符数组而不是字符串,并在使用后显式将字符清零。因此,如果您在登录时遇到堆转储,您可能会看到它;但如果没有,那么你就不会。请参阅JAAS中使用此机制的PasswordCallback。
(因为数组是可变的,所以使用了一个字符数组;因此,您可以在事后通过并将每个字符设置为空格或\0
一旦用于进行身份验证。即使GC不这样做也是如此t快速清理它,内存的内容不应该保存窥探过程的数据。