mdb*_*box 4 java sockets security android keystore
我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.以下是客户端的一些代码.如您所见,我将密码硬编码到本地var中.有没有更好的方法加载密钥库密码,所以我没有在代码中的纯文本?
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;
Run Code Online (Sandbox Code Playgroud)
更新:
事实证明,客户端根本不需要知道密钥库密码.我修改了代码以传入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);
Run Code Online (Sandbox Code Playgroud)
那么这不是一个容易出问题的问题.
例如,您可以在应用程序启动时从用户请求密码,以便密码不会在您的代码中进行硬编码.我认为这是最安全的方法.
如果这是不可能的,那么如果有人有权访问罐子并"看到"代码并随后密码,则会出现问题.您可以委托保护这些罐子的用户.
如果这不可能,那么您可以加密密码并将其存储在某处.然后在您的代码中硬编码密钥以解密密码.所以有人看着罐子里看不到你真正的密码.只有解密密钥.当然,如果一个人付出了实际的努力,他就可以获得密钥并尝试找到密码所在的位置并解密并获得密钥,但这需要更多的努力.
最后,它取决于您的安全要求
| 归档时间: |
|
| 查看次数: |
3777 次 |
| 最近记录: |