假设有一个包含纯文本密码的String变量。
是否有可能使用内存转储读取此密码。 (假设使用了作弊引擎。)我很困惑这个JVM的东西。 JVM是否提供某种保护措施。如果没有我需要使用的做法来避免这种“偷窃”。
实际威胁是特洛伊木马;将内存转储的段发送给外部用户。
答案 0 :(得分:11)
如前所述,是的,任何人都可以通过各种方式提取密码。加密密码实际上没有帮助 - 如果它被应用程序解密,那么解密的表单也会出现在某个时刻,加上解密密钥(或代码)本身就会成为一个漏洞。如果它以加密形式发送到其他地方,那么只知道加密形式足以欺骗交易,所以这也没有多大帮助。
基本上,只要“攻击者”也是“发件人”,你最终会被破解 - 这就是音乐和视频行业无法让DRM工作的原因。
我建议你拿一份Applied Cryptography并阅读第一部分“加密协议”。即使没有深入了解实际加密的数学,这也可以让您对该领域的各种设计模式有一个很好的概述。
答案 1 :(得分:7)
如果您在应用程序中以明文形式保留密码,那么无论您使用何种语言或运行时,都可以通过播放内存转储来读取密码。
要减少发生这种情况的可能性,只需在真正需要时保留密码,然后转储或加密。这里需要注意的一点是,JPasswordField返回char []而不是字符串。这是因为你无法控制String何时消失。虽然你也无法控制char []什么时候会消失,你可以在完成密码后用垃圾填充它。
我说减少因为这不会阻止某人。只要密码在内存中就可以恢复,并且因为解密也必须是可交付物的一部分,所以它也可以被破解而不会打开你的密码。
答案 2 :(得分:4)
这与Java无关 - 对于用任何语言编写的应用程序,存在完全相同的问题(如果它确实存在):
后者通常不被认为是一个问题,因为现代操作系统不允许任意应用程序观察彼此的内存,而privilege escalation攻击通常依赖于不同的攻击向量。
答案 3 :(得分:2)
如果程序知道密码,任何使用该程序的人都可以提取密码。
答案 4 :(得分:2)
理论上你可以把它连接到调试器......设置一个断点......并读取字符串内容