4

我正在编写一个使用FTP加载文件的应用程序。代码如下所示:

String username = "username";
String password = "password";

但是编译后我可以在 .class 文件中看到那些。编译后的代码如下所示:

\00username\00password

所以问题是我可以在编译的代码中看到密码和登录。我认为这不好。我怎样才能让java编译字节码中的字符串?

4

4 回答 4

5

没有将字符串文字编译为“字节码”这样的事情。字符串有一个字节表示,但是,正如您所注意到的,大多数文本查看器会将这个字节表示转换为其正常的 ascii/unicode 表示。无论哪种方式,即使存储混淆的用户名/密码也是一种安全隐患,并且永远不应该这样做。

为了安全地存储用户名/密码,您应该从外部安全文件访问它,而不是将其硬编码到程序中。

于 2013-01-16T22:47:21.230 回答
2

Dicarlo2 说:

为了安全地存储用户名/密码,您应该从外部安全文件访问它,而不是将其硬编码到程序中。

这仍然比在 Java 代码中硬编码要好,但是您可能需要知道字符串是在字符串池中进行的,这也可能是一个安全问题。

这就是Console.readPassword返回 char 数组而不是 String 的原因。 http://docs.oracle.com/javase/tutorial/essential/io/cl.html

其次,readPassword 返回一个字符数组,而不是字符串,因此可以覆盖密码,一旦不再需要它就将其从内存中删除。

但在实际应用中,密码通常用作字符串

于 2013-01-16T23:03:42.413 回答
1

您需要将密码存储为加密值。对受密码保护的实例的每次访问都将使用加密密码,当然还有解密算法和密钥。那么编译文件中就没有密码了。有这个非常糟糕。

于 2013-01-16T22:49:20.313 回答
0

不要对密码进行硬编码,除非它们是加密的或类似的。

如果要在命令行提示用户输入密码,可以使用SO 上发布的这种方法。对于 Swing GUI,使用JPasswordField.

希望这可以帮助!!

于 2013-01-16T22:50:56.793 回答