2013-01-16 83 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