【发布时间】:2011-11-18 22:57:42
【问题描述】:
我是 Android 开发和实现 SSLSockets 的新手。在进行了一些挖掘之后,我能够设置一个正在工作的简单服务器/客户端。我觉得实现可能需要一些工作,并且在如何将密码加载到密钥库而不使用纯文本时遇到了困难。这是客户端的一些代码。如您所见,我将密码硬编码到本地变量中。有没有更好的方法来加载密钥库密码,所以我在代码中没有纯文本?
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 android security sockets keystore