我正在编写一个使用FTP加载文件的应用程序。代码如下所示:
String username = "username";
String password = "password";
但是编译后我可以在 .class 文件中看到那些。编译后的代码如下所示:
\00username\00password
所以问题是我可以在编译的代码中看到密码和登录。我认为这不好。我怎样才能让java编译字节码中的字符串?
我正在编写一个使用FTP加载文件的应用程序。代码如下所示:
String username = "username";
String password = "password";
但是编译后我可以在 .class 文件中看到那些。编译后的代码如下所示:
\00username\00password
所以问题是我可以在编译的代码中看到密码和登录。我认为这不好。我怎样才能让java编译字节码中的字符串?
没有将字符串文字编译为“字节码”这样的事情。字符串有一个字节表示,但是,正如您所注意到的,大多数文本查看器会将这个字节表示转换为其正常的 ascii/unicode 表示。无论哪种方式,即使存储混淆的用户名/密码也是一种安全隐患,并且永远不应该这样做。
为了安全地存储用户名/密码,您应该从外部安全文件访问它,而不是将其硬编码到程序中。
Dicarlo2 说:
为了安全地存储用户名/密码,您应该从外部安全文件访问它,而不是将其硬编码到程序中。
这仍然比在 Java 代码中硬编码要好,但是您可能需要知道字符串是在字符串池中进行的,这也可能是一个安全问题。
这就是Console.readPassword
返回 char 数组而不是 String 的原因。
http://docs.oracle.com/javase/tutorial/essential/io/cl.html
其次,readPassword 返回一个字符数组,而不是字符串,因此可以覆盖密码,一旦不再需要它就将其从内存中删除。
但在实际应用中,密码通常用作字符串
您需要将密码存储为加密值。对受密码保护的实例的每次访问都将使用加密密码,当然还有解密算法和密钥。那么编译文件中就没有密码了。有这个非常糟糕。