我正在研究一个Java密码管理器,我目前拥有所有用户的数据,在从文件解密后,始终在内存中存储并作为字符串存储,以便在UI等中显示。 / p>
这是否存在安全隐患?我特别担心有人以某种方式“倾倒”或读取计算机的内存并找到用户的裸体数据。
我已经考虑过对所有敏感的数据(密码)进行加密,并且只根据需要对每个部分进行解密并在此后进行销毁......但是我宁愿不通过并在迷信中更改大量代码。 / p>
答案 0 :(得分:23)
如果你的对手能够在你的目标机器上运行任意代码(具有转储过程映像所需的调试权限),你就会被搞砸了。
如果你的对手能够准确地读取远处的记忆(即TEMPEST),那么你就是各种各样的傻瓜。
保护传输和存储中的数据(在线路和磁盘上),但不要担心内存中的数据。
*好的,有些课程需要担心。 99.99%的申请表没有,我打赌你的申请没有。
答案 1 :(得分:5)
是的,肯定是这样,特别是因为您可以轻松地调试应用程序。大多数处理加密和不安全数据的代码都使用char数组而不是字符串。通过使用char数组,您可以使用敏感详细信息覆盖内存,从而限制敏感数据的生命周期。
答案 2 :(得分:5)
理论上,你无法完全保护记忆中的任何东西。有些小组在计算机关闭4小时后设法深度冻结了内存芯片并读取了内容。即使没有达到这样的长度,在恰当的时间使用调试器和断点也可以解决问题。
实际上,只是不要将明文保留在内存中超过绝对必要的时间。一个坚定的攻击者会得到它,但是哦。好吧。
答案 3 :(得分:4)
值得注意的是,操作系统可能会决定将内存交换到磁盘,它可能会保留很长一段时间。当然,阅读交换文件需要强大的权限,但谁知道呢?用户的笔记本电脑可能会被盗......