2011-09-16 159 views
4

我是Android開發人員和實現SSLSockets的新手。在做了一些挖掘之後,我能夠設置一個簡單的服務器/客戶端正在工作。我覺得這個實現可能會使用一些工作,並且不知道如何將密碼加載到密鑰庫而不用純文本。這是客戶端的一些代碼。正如你所看到的,我已將密碼硬編碼到本地變量中。有更好的方法來加載密鑰庫密碼,所以我沒有在代碼中以純文本的方式?在Android中隱藏密鑰庫密碼的最佳方式是什麼?

char [] KSPASS = "password".toCharArray(); 
    char [] KEYPASS = "password".toCharArray(); 
    try { 
     final KeyStore keyStore = KeyStore.getInstance("BKS"); 
     keyStore.load(context.getResources().openRawResource(R.raw.serverkeys), KSPASS); 

     final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyManager.init(keyStore, KEYPASS); 

     final TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     trustFactory.init(keyStore); 

     sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(keyManager.getKeyManagers(), trustFactory.getTrustManagers(), null); 
     Arrays.fill(KSPASS, ' '); 
     Arrays.fill(KEYPASS, ' '); 

     KSPASS = null; 
     KEYPASS = null; 

更新:

原來的客戶端並不需要知道密鑰庫的密碼都沒有。我修改了代碼以傳入null作爲密碼。到目前爲止,最初的測試已經與服務器進行通信。在服務器端,我仍然加載密鑰庫密碼。

 final KeyStore keyStore = KeyStore.getInstance("BKS"); 
     keyStore.load(context.getResources().openRawResource(R.raw.serverkeys), null); 

     final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyManager.init(keyStore, null); 

     final TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     trustFactory.init(keyStore); 

     sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(keyManager.getKeyManagers(), trustFactory.getTrustManagers(), null); 

回答

7

那麼這不是一個容易的問題開始。

例如,您可以在應用程序啓動時向用戶請求密碼,以便密碼不會在您的代碼中硬編碼。我認爲這是最安全的方法。

如果這是不可能的,那麼如果有人可以訪問罐子並「看到」代碼並隨後輸入密碼,則會出現問題。您可以委託給保護這些罐子的用戶。

如果這是不可能的,那麼你可以加密密碼並將其存儲在某個地方。然後在您的代碼中,您可以對密鑰進行硬編碼以解密密碼。所以有人看着jar看不到你的真實密碼。只有解密密鑰。當然,如果一個人付出了實實在在的努力,他可以獲得密鑰並嘗試找到密碼所在的位置並解密密鑰並獲得密鑰,但這需要付出更多的努力。

在這取決於你有什麼安全要求

+0

Java很容易反編譯和閱讀。當你按照這些呼叫,你會看到這些額外的加密部分相當快。但是,他應該將其視爲未加密網絡流的風險遠比這更危險。 – lhw

+0

那麼,正如所提到的,如果攻擊者做了額外的努力,他最終可以獲得密鑰。最好的選擇是在啓動時詢問用戶密碼。 – Cratylus

+0

該評論意在作爲提問者的附加信息。我應該指出的。 – lhw

1

如果你真的想保護用戶憑據,那麼你必須他們驗證自己的身份,只要你想訪問憑據結束。但是,如果每次登錄時向用戶詢問密碼,大多數用戶都會感到惱火,因此作爲開發人員,您必須確定您對安全性的關注程度,以及爲用戶提供簡單易用的界面。

您可以考慮的一種選擇是存儲密碼,但要使用用戶提供的PIN加密密碼。然後每當用戶想要訪問他們的密碼時,他們只需提供用於解密密碼的PIN碼。

+1

此PIN存儲在哪裏? –

相關問題