6

假设有一个包含纯文本密码的字符串变量。

是否有可能使用内存转储读取此密码。(假设使用作弊引擎。)我对这个 JVM 的东西感到困惑。JVM 是否对此提供某种保护。如果没有,我需要使用哪些做法来避免这种“偷窃”。

实际威胁是特洛伊木马;将内存转储的段发送给外部方。

4

5 回答 5

11

如前所述,是的,任何人都可以通过各种方式提取密码。加密密码并没有真正的帮助——如果它被应用程序解密,那么解密的形式也会在某个时候出现,而且解密密钥(或代码)本身也成为一个漏洞。如果它以加密形式发送到其他地方,那么仅仅知道加密形式就足以欺骗交易,所以这也无济于事。

基本上,只要“攻击者”也是“发送者”,你最终就会被破解——这就是音乐和视频行业无法让 DRM 发挥作用的原因。

我建议你拿起一本应用密码学并阅读第一部分“密码协议”。即使没有深入了解实际加密的数学知识,这也将使您对该领域的各种设计模式有一个很好的概述。

于 2009-10-02T09:33:14.863 回答
7

如果您在应用程序中以纯文本形式保存密码,那么无论您使用何种语言或运行时,人们都可以通过玩内存转储来读取它。

为了减少这种情况发生的机会,请仅在您真正需要时将密码保存为纯文本,然后转储或加密它。这里要注意的一件事是 JPasswordField 返回一个 char[] 而不是一个字符串。这是因为您无法控制字符串何时消失。虽然您也无法控制 char[] 何时消失,但您可以在完成密码后用垃圾填充它。

我说减少,因为这不会阻止某人。只要密码在内存中,它就可以被恢复,并且由于解密也必须是可交付成果的一部分,它也可能被破解,让您的密码完全敞开。

于 2009-10-02T08:33:11.817 回答
4

这与 Java 无关 - 用任何语言编写的应用程序都存在完全相同的问题(如果确实是一个问题):

  • 如果可执行文件包含密码,无论如何混淆或加密,有权访问可执行文件的每个人都可以找到密码。
  • 如果应用程序暂时知道密码或密钥(例如,作为网络身份验证协议的一部分),那么任何可以观察应用程序正在执行的内存的人都可以找到密码。

后者通常不被认为是一个问题,因为现代操作系统不允许任意应用程序观察彼此的内存,并且特权升级攻击通常依赖于不同的攻击向量。

于 2009-10-02T10:48:05.147 回答
2

如果程序知道密码,任何使用该程序的人都可以提取密码。

于 2009-10-02T08:36:34.257 回答
2

从理论上讲,您可以将其连接到调试器...设置断点...并读取字符串内容

于 2009-10-02T08:37:49.410 回答