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