java在Android中隐藏密钥库密码的最佳方法是什么?
我对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);
# 1 楼答案
首先,这不是一个容易的问题
例如,您可以在应用程序启动时向用户请求密码,这样密码就不会硬编码在代码中。我认为这是最安全的方法
如果这是不可能的,那么如果有人能够访问JAR并“看到”代码以及随后的密码,那么问题就会出现。您可以委托给保护这些JAR的用户
如果这是不可能的,那么您可以加密密码并将其存储在某处。然后在代码中硬编码密钥以解密密码。因此,有人在查看jar时看不到您的真实密码。只有解密密钥。当然,如果一个人付出真正的努力,他可以得到密钥,并试图找到密码的位置,解密它,并获得密钥,但这需要更多的努力才能做到
最后,这取决于您有什么安全要求
# 2 楼答案
如果您确实想保护用户凭据,则无论何时您想要访问凭据,都必须要求他们验证其身份。然而,如果您每次登录时都询问用户的密码,大多数用户都会感到恼火,因此作为开发人员,您必须决定您在多大程度上关心安全性,而不是为用户提供简单易用的界面
您可以考虑的一个选项是存储密码,但使用用户提供的PIN加密密码。然后,每当用户想要访问他们的密码时,他们只需提供PIN,您就可以使用PIN来解密密码