可运行的jar文件可以解释为java源代码

时间:2012-06-03 15:46:28

标签: java jar jvm exe

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

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

  • runnable * jar文件 * 究竟包含哪些内容?
  • 如果可运行的jar文件包含类文件,那么无论如何都可以解释类文件以查看源代码会破坏密码的代码吗?
  • 从cmd运行可运行jar文件并键入“java -jar xxx”“xxx”表示文件名,“ - jar”表示您要运行jar文件而“java”表示运行JVM中的以下文件?
  • 这是 .exe文件,当转换为 .exe文件时,无法对可读源代码执行此操作。

3 个答案:

答案 0 :(得分:7)

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

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

您可以反编译字节代码:http://www.program-transformation.org/Transform/JavaDecompilers以获取源代码。但你实际上可以在字节码中看到密码而不反编译

是肯定的。在java -jar xxx中,java表示使用名为xxx

的jar文件运行jvm

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

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

答案 1 :(得分:6)

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

所以,不,密码在类文件中本身并不安全(因此不在jar存档中,因为jar可以很容易地解压缩。)

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

答案 2 :(得分:4)

基本上,无论你怎么努力,它都可以很容易地反编译并被任何人阅读。

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

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

这个想法是the hash function is only one-way,密码无法从其哈希中恢复。因此,如果密码足够强大,任何人都无法在合理的时间内获取密码。

对此非常好的解读是wiki链接 - but most notably this article on jasypt.org

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