在Android中隐藏密钥库密码的最佳方法是什么?

我是Android开发和实现SSLSockets的新手。 在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端。 我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本。 这是客户端的一些代码。 如您所见,我将密码硬编码到本地var中。 是否有更好的方法加载密钥库密码,所以我没有在代码中以纯文本forms?

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; 

更新:

事实certificate,客户端根本不需要知道密钥库密码。 我已修改代码以传入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); 

那么这不是一个容易出问题的问题。

例如,您可以在应用程序启动时从用户请求密码,以便密码不会在您的代码中进行硬编码。我认为这是最安全的方法。

如果这是不可能的,那么如果有人有权访问jar子并“看到”代码并随后密码,则会出现问题。 您可以委托保护这些jar子的用户。

如果这不可能,那么您可以加密密码并将其存储在某处。 然后在您的代码中硬编码密钥以解密密码。 所以有人看着jar子里看不到你真正的密码。只有解密密钥。 当然,如果一个人付出了真正的努力,他就可以获得密钥并尝试找到密码的位置并解密并获得密钥,但这需要更多的努力。

最后,它取决于您拥有的安全要求

如果您确实想要保护用户凭据,则必须要求他们在您想要访问凭据时validation其身份。 但是,如果您每次登录时都要求他们输入密码,大多数用户都会感到恼火,因此您作为开发人员必须决定您关心安全性的程度与为用户提供简单易用的界面。

您可以考虑的一个选项是存储密码,但使用用户提供的PIN加密密码。 然后,每当用户想要访问他们的密码时,他们只需提供您用来解密密码的PIN。