4

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

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

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

3 回答 3

7

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

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

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

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

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

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

于 2012-06-03T15:52:51.417 回答
6

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

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

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

于 2012-06-03T15:50:14.250 回答
4

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

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

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

这样做的想法是散列函数只是单向的,无法从其散列中恢复密码。因此,如果密码足够强大,没有人应该能够在合理的时间内获得您的密码。

一个很好的阅读是 wiki 链接 -但最值得注意的是 jasypt.org 上的这篇文章

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

于 2012-06-03T16:03:39.260 回答