我正在编写一个使用 FTP 加载文件的应用程序。代码如下所示:
String username = "username";
String password = "password";
但是在编译之后我可以在.class文件中看到它们。 编译代码如下所示:
\00username\00password
所以问题是我可以在编译的代码中看到密码和登录。我认为那不好。如何在字节码中创建java编译字符串?
答案 0 :(得分:5)
没有将字符串文字编译为“字节码”的事情。有一个String的字节表示,但是,正如您所注意到的,大多数文本查看器会将此字节表示转换为其正常的ascii / unicode表示。无论哪种方式,存储甚至混淆的用户名/密码都存在安全隐患,并且永远不会完成。
为了安全地存储用户名/密码,您应该从外部安全文件访问它,而不是将其硬编码到程序中。
答案 1 :(得分:2)
为了安全地存储用户名/密码,您应该访问 它来自外部安全文件,而不是硬编码到程序中。
这仍然比在Java代码中对其进行硬编码更好,但您可能需要知道字符串是在字符串池中实现的,这也可能是一个安全问题。
这就是Console.readPassword
返回char数组而不是String的原因。
http://docs.oracle.com/javase/tutorial/essential/io/cl.html
其次,readPassword返回一个字符数组,而不是String,所以 密码可以被覆盖,一旦将其从内存中删除 不再需要了。
但在实际应用中,密码通常用作字符串
答案 2 :(得分:1)
您需要将密码存储为加密值。每次访问受密码保护的实例都将使用加密密码,以及解密算法和密钥。然后,您将不会在编译的文件中拥有密码。这很糟糕。
答案 3 :(得分:0)
除非密码是加密的,否则不要对密码进行硬编码。
如果要在命令行上提示用户输入密码,可以使用在SO上发布的this method。对于Swing GUI,请使用JPasswordField
。
希望这会有所帮助!!