【问题标题】:Can runnable jar files be interpreted back into java source code [duplicate]可运行的jar文件可以解释回java源代码吗?
【发布时间】:2012-06-07 23:01:38
【问题描述】:

当我从 eclipse 的 java 源代码文件 创建 可运行的 jar 文件 时,我相信它会创建一个类文件,然后可以由 JVM 运行。

我问这个的原因是因为我要制作一个保存我所有密码的 java 应用程序。该应用程序将包含一个要求输入密码的界面,然后如果密码正确,则显示密码。以下是我关于这个主题的问题:

  • 可运行的 *jar 文件*究竟由什么组成?
  • 如果可运行的 jar 文件类文件组成,那么该 类文件是否可以被解释为能够查看源代码会破坏密码的代码?
  • 当您从 cmd 运行 可运行 jar 文件 并键入 "java -jar xxx" 时。 "xxx" 表示文件名,"-jar" 表示你要运行一个 jar 文件,"java" 表示运行JVM中的以下文件?
  • 这样是不是像.exe文件,转成.exe文件后无法解除可读源代码。

【问题讨论】:

  • 相关:stackoverflow.com/questions/2537568/best-java-obfuscator - 简而言之:确保即使有源代码,也没有人能找到您的密码。
  • Jetty 使用一种简单的方式来对密码进行编码,因此它们不是人类可读的。你可能想做类似的事情。
  • 您不使用现成的密码管理器应用程序是否有特殊原因?了解安全性并努力避免您的问题的回答者指出的各种问题的人们已经开发了各种商业和开源选项。例如,Password Safe 是一个开源密码管理器,由著名的密码学家和安全从业者 Bruce Schneier 创建

标签: java jar jvm exe


【解决方案1】:

基本上,无论你多么努力,任何人都可以轻松地对其进行反编译和阅读。

如果可以,不要存储密码,在您的服务器上在线比较它(使用asynchronous encryption)或使用每次给应用程序的主密码存储它。

如果不能,请不要按原样存储密码。我能想到的最好的事情是存储(并检查)密码的哈希码。用户输入密码,然后是SHA-256'd,然后将生成的哈希码与您存储的密码哈希码进行比较。添加salt 以防止rainbow tables

这个想法是the hash function is only one-way,密码无法从其哈希中恢复。因此,如果密码足够强大,应该没有人能够在合理的时间内获得您的密码。

维基链接 - but most notably this article on jasypt.org.

也就是说 - 如果您尝试加密包含哈希的文件以增加另一层安全性,仍然可以使用反编译器和调试器找到解密的密码,所以不要真的指望它对某人超级有效真的很想通过。因此,它更像是security through obscurity,而不是真正的加密。

【讨论】:

    【解决方案2】:

    对于未提出的问题:如果您的密码在源代码中,它将以很容易找到的方式出现在类文件中。

    可运行的 jar 文件是一个 jar 文件(即带有 jar 后缀的 zip 文件),其中包含类文件和包含有关要启动哪个类的信息的特殊文件。

    您可以反编译字节码:http://www.program-transformation.org/Transform/JavaDecompilers 获取源代码。但其实不用反编译就能看到字节码里面的密码

    是的。 in java -jar xxx java 表示使用名为 xxx 的 jar 文件运行 jvm

    如果您知道创建的语言和工具,您应该能够将 exe 文件反编译为类文件。即使源代码中没有密码,也很容易在 .exe 文件中找到。所以是的,jar 文件有点像 exe 文件,但它们与您描述的不同。

    如果您想创建一个应用程序来维护您的密码,请使用您作为应用程序用户在启动时提供的主密码来加密存储的密码。永远不要在源代码中存储密码。

    【讨论】:

      【解决方案3】:

      Java 类文件可以反汇编成可读的 Java 代码。不过,更简单的是,您可以从已编译的类文件中提取所有密码,因为它们以纯文本形式存储(例如,尝试 GNU 机器上的 strings 命令)。

      所以,不,密码在类文件中本质上是不安全的(因此不在 jar 存档中,因为 jar 很容易解包)。

      您需要做的是实施某种加密,并让您的程序将密码保存在加密文件中。然后,您的程序将需要您输入解密密钥才能解压密码。密钥应该包含在Java程序中,它应该由在您每次运行程序时提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多