2017-04-02 79 views
1

我正在嘗試爲網站構建一個非官方的API。它將要求用戶登錄,並使用標準的Console.readPassword()方法從控制檯讀取密碼。現在,這給了我一個char數組,但我必須通過使用Apache的HttpClient庫中的HttpPost類的POST請求發送密碼。爲此,需要一個字符串,但將密碼轉換爲字符串會產生安全風險。 我能做什麼?Java中的密碼安全性 - 將char []轉換爲字符串

編輯:我知道如何將char數組轉換爲字符串。問題在於字符串是不可變的,因爲你不能在Java中顯式地刪除對象,所以密碼將留在內存中。

+1

我覺得這個問題會更適合https://security.stackexchange.com –

回答

0

安全的人會告訴你的精彩的secure string概念,以防止堆檢查。

我曾經是這個的信徒,而不是更多。值得注意的是.Net等價的SecureString正在被淘汰 - 你只需要觀看大約10分鐘的this美妙的youtube視頻,看看爲什麼。這個概念聽起來很棒,直到你必須真正對數據做些什麼,然後很可能無法保證它的安全(就你的情況而言 - 你需要使用Apache庫)。另外,在許多平臺上,加密字符串的關鍵字與字符串本身存在相同的內存空間,所以它比安全性更容易混淆。另見Security Stack Exchange discussion。底線:這是語言中的一個固有問題,你可以做的很多事情來防止它。

+1

非常有趣。感謝你的回答! –

0

我會建議在客戶端散列輸入用戶密碼並將散列發送到服務器,因爲在服務器端存儲純文本密碼首先是安全風險。 This answer勾畫出散列在Java中的密碼,然後驗證與存儲在服務器上的散列密碼時在用戶登錄

+0

我沒有訪問服務器代碼的權限。這是一個通過https接受登錄信息的常規網站。 –

+0

雖然客戶端哈希的概念是我認爲我們應該採用的概念,但通過這個想法實現安全性說起來容易做起來難。例如,除非您在服務器端執行額外的散列,否則pass-the-hash攻擊仍然可以工作。有關複雜性的更多信息[此處](https://eprint.iacr.org/2015/387.pdf)。 – TheGreatContini

0

使用String.valueOf();的整個方法:

String str = String.valueOf(Console.readPassword());