2014-01-22 112 views
-1

希望我不需要充斥這個帖子我的代碼收到時,但如果需要的話,請你展示字符串代替。 另外,我只用getPassword().toString()出於測試目的,我也不在我的任何應用程序中使用它。對象通過流

客戶端:從JPasswordField passfield 抓取密碼,將其作爲一個字符串通過ObjectOutputStream out

服務器端: 通過ObjectInputStream in接收字符串,打印到控制檯

很容易的,但這個問題我我的意思是,而不是字符串顯示,它打印一個對象([C @ 6af3a631) 我發送和接收對象的方式很簡單:

客戶端:

out.writeObject(passfield.getPassword().toString()) 

服務器:

Object data; 

while((data = in.readObject) != null) { 
    if(data instanceof String) { 
     System.out.println(data); 
    } 
} 

如果我送"hey",而不是passfield.getPassword().toString()),該字符串打印出來就好了。 我已經越來越熟悉不過的ObjectOutputStream,我從來沒有遇到這樣的問題,所以我猜它可能與JPasswordField

這做的是對幫助我瞭解更大的問題的一小步(含包密碼發送正常,包收到就好,但密碼變量爲空)。

+0

'passfield.getPassword()。的toString()'**不要調用任何**'String'情況下可能會流連在JVM中被竊取,所以永遠不要轉換密碼爲'String'。 –

+0

是的,我瞭解到,這僅用於測試目的。我認爲char []可能在當時造成了一些干擾,所以我把它作爲字符串發送來檢查 –

+0

@AndrewThompson,而不是......?如果你說「*不要那麼做」,那麼你也可以說說做什麼。 –

回答

2

你調用一個char[]toString()。這並不做你認爲它 - 它會返回類似「[C @ 6af3a631」因爲數組不覆蓋toString()。你最終從ObjecttoString()默認實現:

Object類的toString方法返回一個包含其中的對象是一個實例,則在符號字符'之類的名稱的字符串@」 ,以及對象的哈希碼的無符號十六進制表示。

可以使用:

// Eek - security problem! 
out.writeObject(new String(passfield.getPassword()); 

...但這會讓一個字符串在內存中徘徊,不能再被清除。它也以明文形式傳輸密碼,除非以其他方式保護此流,否則這種情況非常糟糕。

我懷疑你可以用:

out.writeObject(passfield.getPassword()); 

這將發送char[]作爲一個對象,你會得到相同的char[]出來在另一端。它並不雖然解決了「發送密碼」的問題 - 你仍然需要清除char[]事後,避免密碼是在內存中訪問。