当前位置: 首页 > 面试题库 >

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

危钱明
2023-03-14
问题内容

我是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);

问题答案:

好吧,这不是一个容易解决的问题。

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

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

如果无法做到这一点,则可以加密密码并将其存储在某处。然后在您的代码中对密钥进行硬编码以解密密码。因此,看着罐子的人看不到您的真实密码,只有解密密钥。当然,如果真心付出,他可以获取密钥并尝试找到密码所在的位置,然后解密并获取密钥,但这需要更多的努力。

最后,这取决于您的安全要求



 类似资料:
  • 我已经使用Spring框架大约4年了,现在使用Spring Boot已经有几个月了。我的Spring MVC应用程序通常部署在Java EE容器上,如JBoss/WildFly或WebLogic。这样做允许我将JNDI用于数据源或任何其他涉及机密/密码的敏感数据。这使得我的应用程序基于其名称“消费”JNDI资源。 现在有了Spring Boot,尤其是对于自包含的微服务(嵌入式tomcat),这些

  • 问题内容: 我正在寻找创建一个可重用的函数,该函数将生成一个随机密钥,该随机密钥具有选定长度(可从2到1000+)的可打印ACSII字符。我认为可打印的ASCII字符应为33-126。它们的密钥不需要完全唯一,只要在完全相同的毫秒内生成就可以唯一(因此不起作用)。 我正在考虑将结合使用,并且可能会起作用。 这是要走的路,还是其他最佳方法? 编辑: 也将不起作用,因为它没有长度参数,这就是PHP给您

  • 我用过这个命令 生成密钥库。它工作正常,但从我读到的内容来看,这个命令还应该提示您输入密钥密码(而不是存储密码)?我从来没有收到过这样的提示。我能跑 查看密钥库的内容。钥匙似乎就在那里。。。正确的别名在那里。在哪里获取/设置特定别名的密码? 我有一个key.properties在Android目录 在build.gradle我有: 当我试图生成一个发布版本时,我得到了 我想它可能与keyPassw

  • 在运行spark作业时,可以在事件日志中以纯文本形式看到SSL密钥密码、keystorepassword。你能帮我如何从日志中隐藏这些密码吗? 当我看到下面的内容时,https://issues.apache.org/jira/browse/spark-16796似乎是他们修复了它,使其不受web UI的影响。但我不确定我能用原木修复它 你的帮助真的很感激!! “{”事件“:”SparkListe

  • 我试图为某些设备生成密钥时出错。我能够在运行4.4.2的三星Galaxy Note上重现错误。 我创建了一个小应用程序,只能通过从Android开发者页面“生成新私钥”下的https://developer.android.com/training/articles/keystore.html逐行复制代码来生成密钥 错误似乎发生在kpg.generateKeyPair(),在Android Key

  • 问题内容: 我正在使用Redis来存储一些信息并检测该信息随时间的变化(例如,考虑用户和位置)。使用更长或更短的键名的值是什么?使用更长的键会更清楚,但是使用更长的键名是否会在内存或性能上付出很多成本? 以下是示例: 要么 问题答案: 这完全取决于您将如何使用它。如果每个字节都很重要,例如,当您必须为传输到云服务的每个kB支付费用时,您可以计算成本。数学很简单;一个字节是“在线”上的一个字节。在r