我是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);
Java很容易反編譯和閱讀。當你按照這些呼叫,你會看到這些額外的加密部分相當快。但是,他應該將其視爲未加密網絡流的風險遠比這更危險。 – lhw
那麼,正如所提到的,如果攻擊者做了額外的努力,他最終可以獲得密鑰。最好的選擇是在啓動時詢問用戶密碼。 – Cratylus
該評論意在作爲提問者的附加信息。我應該指出的。 – lhw