有人可以从Java应用程序中窃取密码吗?

时间:2009-10-02 08:28:29

标签: java password-protection

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

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

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

5 个答案:

答案 0 :(得分:11)

如前所述,是的,任何人都可以通过各种方式提取密码。加密密码实际上没有帮助 - 如果它被应用程序解密,那么解密的表单也会出现在某个时刻,加上解密密钥(或代码)本身就会成为一个漏洞。如果它以加密形式发送到其他地方,那么只知道加密形式足以欺骗交易,所以这也没有多大帮助。

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

我建议你拿一份Applied Cryptography并阅读第一部分“加密协议”。即使没有深入了解实际加密的数学,这也可以让您对该领域的各种设计模式有一个很好的概述。

答案 1 :(得分:7)

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

减少发生这种情况的可能性,只需在真正需要时保留密码,然后转储或加密。这里需要注意的一点是,JPasswordField返回char []而不是字符串。这是因为你无法控制String何时消失。虽然你也无法控制char []什么时候会消失,你可以在完成密码后用垃圾填充它。

我说减少因为这不会阻止某人。只要密码在内存中就可以恢复,并且因为解密也必须是可交付物的一部分,所以它也可以被破解而不会打开你的密码。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

理论上你可以把它连接到调试器......设置一个断点......并读取字符串内容

相关问题