我有一個通過安全/ SSL套接字連接到服務器的客戶端應用程序。用戶需要在應用程序啓動時登錄。現在我需要將實際密碼發送到服務器(通過SSL加密),而不是發送密碼散列的首選方法。如此一來,如何安全地將密碼存儲在客戶端內存中,以便在客戶端由於丟失連接而需要重新連接到服務器後面的服務器時重新使用此密碼?如何在Java客戶端中存儲服務器密碼以便以後重新連接?
我可以很容易地加密密碼,甚至可以把它放到一個KeyStore中,然後在重新連接時檢索它,但是,即使我這樣做,在我看來黑客可以檢索密碼,如果他有權訪問在調試器中應用。當人們需要暫時將密碼存儲在客戶端時,這僅僅是一個事實嗎?
實現相同目標是否有更好的/首選的方式(即允許客戶端重新連接到服務器而不需要用戶在首次登錄後再次輸入密碼)?從服務器發送的過期登錄令牌是否是更好的方式(我可以在重新連接時將此過期令牌傳遞迴服務器而不是密碼)?
最後,一般來說,在應用程序正確「剝離」調試符號時,有人將調試器連接到Java桌面或Android上的正在運行的應用程序有多容易?我是否甚至需要擔心這種情況,或者Java會保護我的發貨應用程序不讓調試器或其他內存分析器連接到它?
我不明白爲什麼一個令牌比黑客試圖暴力破解密碼更容易受到暴力攻擊? – 2011-05-09 22:43:57
因爲通常,令牌比密碼更具結構。也;令牌按原樣發送(因爲它應該映射到服務器端的會話),而密碼可以被散列(相同的密碼映射到相同的「未知」數據;可預測性較差)。另一個風險在於開發工作;必須創建會話和令牌認證層,而使用相對「簡單」的密碼技術則需要更少的工作量。假設程序員每5分鐘引入一個bug。實施時間較短意味着更少的錯誤。 – Pindatjuh 2011-06-21 13:58:41