2009-10-02 21 views
6

假设有一个保存纯文本密码的字符串变量。有人可以从Java应用程序窃取密码吗?

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

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

+2

我只想指出,迄今为止所有的答案同样适用于几乎所有的语言,而不仅仅是Java。问题完全一样。有些语言可能会比其他语言更容易或更难,但它们都具有相同的基本“漏洞”。 – 2009-10-02 10:46:30

+0

如果这个“某人”无缘无故地访问了JVM,那么与堆检查攻击相比,您会更加担心这些事情。大多数人会说'游戏结束'。类似的SO问题在http://stackoverflow.com/questions/646224/how-does-one-store-password-hashes-securely-in-memory-when-creating-accounts – 2009-10-02 10:55:48

+0

将密码存储在服务器中,并检查它何时需要 – 2012-03-28 13:24:58

回答

11

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

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

我建议你拿起一份Applied Cryptography并阅读第一部分“密码协议”。即使没有深入研究真正的密码学数学,这也会让你对这个领域的各种设计模式有一个很好的概述。

7

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

减少发生这种情况的可能性只有在您确实需要时才将密码保存为纯文本,然后转储或加密它。这里需要注意的一点是,JPasswordField返回一个char []而不是一个字符串。这是因为你无法控制字符串何时消失。虽然您无法控制char []何时消失,但在完成密码后可以使用垃圾填充它。

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

+0

是的,for(char nextChar:pw)nextChar = 0; // 哪一个可能不行,请注意:final char []不是最终的 – 2009-10-02 08:52:19

+0

您必须使用normal循环而不是foreach。是的,值得说明的是最终适用于数组的引用而不是值。 – 2009-10-02 09:01:22

2

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

+3

任何人都有足够的技术熟练...... – 2009-10-02 09:51:52

2

从理论上讲,你可以只把它挂到调试器...设置断点......和阅读字符串内容

4

此无关的Java - 完全相同的问题(如果它真的是一个)也不存在任何语言编写的应用程序:

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

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

+0

如果你不知道它并且开发你的系统就好像“加密的”键确实是安全的那样,这是一个问题。 – 2009-10-02 10:50:26

相关问题