2010-08-10 29 views
11

我正在閱讀關於在一本java認證書中的java.io.Console類,可能我錯過了上一章的基礎知識,但有人可以解釋下面的內容嗎?Java控制檯; readPassword,數組如何防止確定密碼值?

它提到,readPassword方法返回一個字符數組而不是一個字符串,以防止潛在的黑客找到這個字符串,然後找到密碼。

字符數組如何更安全?如果你可以獲得數組中的值,那麼你是否可以不創建腳本來遍歷各種組合,並最終找到密碼?

回答

12

documentation

控制檯對象支持通過其readPassword方法安全的密碼輸入。這種方法有兩種方式來幫助保護密碼輸入。首先,它抑制回聲,所以密碼在用戶的屏幕上不可見。其次,readPassword返回一個字符數組,而不是一個String,所以密碼可以被覆蓋,一旦不再需要它就從內存中移除。

的這裏的想法是,你可以,只要你驗證密碼撥打Arrays.fill(或同等學歷),以「空白」的字符數組,並從該點的密碼不再存儲在內存中。由於字符串是不可變的,字符串將保留在堆中,直到它被垃圾收集 - 如果它設法實現實現將永遠不會,並且在任何其他情況下可能仍然「太長」。它一直存在,它可能容易受到各種媒介的嗅探。

2

一個字符串是一個不可變的類,當密碼存儲在一個字符串中時,你無法控制其生命週期,這意味着它可以在內存中使用(並受內存轉儲等)時間(即使它沒有被執行,直到JVM退出,它將在內存中)。當它存儲在字符數組中時,您可以清除數組,並在驗證後從內存中移除密碼。

4

這是最好的做法之一。這並沒有太大的意義,但我們只是爲了輕鬆的生活而做到這一點。

如果密碼在內存中,則緩衝區讀取溢出可能允許讀取它。或者它可以保存在覈心轉儲或休眠映像中。使用可變的char[]允許數據在希望縮小的窗口之後被銷燬,只要它沒有被複制到字符串中,被複制到別處,它可能在緩衝區,垃圾收集喜歡移動對象等等。

Swing中有一個有趣的例子,其中JPasswordField提供了一個char[]的方式來讀取數據,但是例如如果它有一個動作監聽器(這是一個非常常用的方法)將從數據創建一個String