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

时间:2011-09-16 19:37:18

标签: java android security sockets 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;

更新

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

2 个答案:

答案 0 :(得分:7)

这一开始不是一个容易的问题。

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

如果无法做到这一点,那么如果有人可以访问罐子并“看到”代码并随后密码,则会出现问题。您可以委托保护这些罐子的用户。

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

最终取决于您的安全要求

答案 1 :(得分:1)

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

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