我正在开发一个Java密码管理器,目前我已经解密了所有用户的数据,这些数据在内存中一直保留,并以明文形式存储为字符串以供UI显示等。
这种方式是否存在安全风险?我特别担心有人以某种方式“倾轧”或读取计算机的内存,并找到用户的裸露数据。
我考虑过将所有敏感数据(包括密码)加密,并仅在需要时解密每个部分,然后销毁该数据……但我不想基于一些迷信而修改大量代码。
是的,特别是因为你可以轻松地对应用进行调试。大多数处理加密和不安全数据的代码使用字符数组而不是字符串。通过使用字符数组,您可以覆盖带有敏感信息的内存,并限制敏感数据的生命周期。
/proc/PID/mem
也可以作为用户拥有的进程。 - Jé Queue理论上来说,你无法完全保护内存中的任何内容。某些组织甚至可以在计算机关闭4小时后冷冻内存芯片并读取其内容。即使不采取这种极端手段,只要在正确的时间使用调试器和断点就可以轻松实现。
但实际上,只要不必要,就不要将明文保存在内存中。即使攻击者再怎么努力,也可能会失败。