2013-01-16 61 views
4

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

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

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

\00username\00password 

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

+16

首先,我不认为你硬编码的用户和密码是一个好主意。 – Jagger

+1

它们已经在字节码中了...... – OscarRyz

+0

这只是一个展示。真正的节目价值的来源是不同的。但这件事并没有改变这个问题。 – timofeiMih

回答

5

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

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

+0

该文件必须放置在哪里?我认为它不难改变任何程序文件的许可。所以这又造成了另一个问题 – timofeiMih

+0

不知道你想做什么的具体细节很难说。例如,如果您正在编写Web服务器,则会存储散列版本的凭证(不能颠倒),然后客户端将在登录时发送密码的散列版本,以与存储在散列版本中的散列版本进行比较文件。 –

+1

除非您有权限,否则您无法更改文件的权限! – jahroy

1

您需要将密码存储为加密值。每次访问受密码保护的实例都将使用加密密码,以及解密算法和密钥。那么你将不会在编译的文件中拥有密码。这非常糟糕。

+0

是否存在与此相似的一些限制?我知道自己写解密器并不好。 – timofeiMih

0

不要硬编码密码,除非它们被加密或类似。

如果要在命令行中提示用户输入密码,可以使用SO上发布的this method。对于Swing GUI,请使用JPasswordField

希望这有助于!

+0

nope。我需要提供一个ftp访问任何人。即使ecrypting不会工作。因为这也会被看到。 – timofeiMih

+0

如果您为每个人提供访问权限,那么为什么服务有密码?如果任何人都可以访问该服务,那么隐藏密码有什么意义?如果您确实需要限制访问权限,则可能会向需要访问凭据的人员授予权限。 – MathSquared

+0

我需要密码,因为它们将文件存储在其文件夹中。但是ftp可以访问“images”文件夹。我无法为在我的网站上注册的每个用户开立帐户。例如, 。名为“user1”的用户将其文件存储在images/user1中 – timofeiMih

2

Dicarlo2说:

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

这比在Java代码中硬编码更好,但您可能需要知道字符串是否在字符串池中实现,这也可能是一个安全问题。

这就是为什么Console.readPassword返回字符数组而不是字符串。 http://docs.oracle.com/javase/tutorial/essential/io/cl.html

其次,readPassword返回一个字符阵列,而不是字符串,所以 密码可以尽快覆盖,从内存中删除,因为它不再需要 。

但在实际应用中的密码经常被用来作为字符串

+0

它们在编译源代码中似乎相同。所以这对问题没有帮助 – timofeiMih

+1

我并不是说你应该将密码硬编码为char数组,但是你应该使用外部数据源和char数组来提高安全性。 –

+0

我明白了。感谢您的帮助 – timofeiMih