【问题标题】:Good Practice: How to handle keystore passwords in android/java? [duplicate]良好实践:如何在 android/java 中处理密钥库密码? [复制]
【发布时间】:2014-03-05 23:35:17
【问题描述】:

假设密钥库的密码不是由用户密码提供或绑定到用户密码(这或多或少意味着它只是代码中某处的字符串或数组 []),它是否足以保护它不能或只能勉强从字节码中提取出来?

我知道密钥库(JKS / BKS)的密码仅用于验证密钥库的完整性。此外,很明显,我必须假设应用程序在或多或少受信任的环境中运行才能“安全”。但无论如何,是否可以仅从 apk 文件中提取密码?

在应用程序的源代码中硬编码任何密码感觉是错误的,所以也许有一些想法,如何使其实际上不那么具有威胁性。 例如。是在外部配置文件中配置密码还是在安装应用程序期间随机生成密码更好(然后将其存储在哪里)?

【问题讨论】:

  • 从字节码/apks中提取一些东西并不难。如果你反编译它,你就会再次粗略地获得纯文本的源代码。我不会打扰太多,如果你的应用程序(或你隐藏在其中的秘密)值得黑客攻击,那么会有人这样做。
  • 我会说它值得黑客攻击。 :) 所以对我来说重要的是,如果密码被泄露,其他应用程序安装不会被感染。因此,为安装创建密码似乎至少是一个“更好”的解决方案。
  • 如果是密钥库密码,我可以简单地将println 添加到例如Keystore.load 进入我的自定义固件,甚至不需要触摸您的应用程序。这很简单。 Dexguard 不能防止调用不受信任的平台代码,您需要自行实现,因此我需要嗅探您的网络流量或从内存转储中读取值。

标签: java android security keystore password-protection


【解决方案1】:

尝试使用 null 代替密码(请参阅this question

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】:

    使用密码对密钥库进行加密是很常见的,但这并不是必需的。

    将密码存储在密钥库附近或多或少等同于拥有一个未加密的密钥库。这可能完全没问题。即,在密钥库文件受其他方式保护的服务器上,具有两个证书和私钥的未加密密钥库并不罕见。

    如果有人能够更改密钥库的内容,您似乎在这里试图防御的那种攻击。密码可用于验证密钥库的完整性,但前提是攻击者不知道该密码。它无法想到攻击者可以访问您的密钥库但无法访问您的应用程序的字节码或应用程序的其他配置的典型场景。

    Android 中应用程序的文件系统相当安全,但无论如何都不是防弹的。如果您不信任该文件系统,则需要使用用户输入的密码或从设备外部其他地方获取的密码来加密密钥库。另一方面,如果您信任文件系统,您实际上根本不需要加密密钥库(或者,如果这使您的开发更容易,您可以使用众所周知的密码对其进行加密)。

    【讨论】:

      【解决方案3】:

      它只是不能或几乎不能从字节码中提取出来的保护是否足够?

      “足够”是一个主观术语;只有你自己才能确定你觉得什么对你来说是足够的。

      是否可以仅从 apk 文件中提取密码?

      是的,因为 APK 文件可以被反编译,未加密的网络会话可以被嗅探等等。

      如何让它实际上不那么具有威胁性

      您可以购买 DexGuard 的许可证并使用它,因为它会加密硬编码字符串,例如您的密码。这是否值得额外的防御是你的决定。

      在外部配置文件中配置密码会更好

      任何根设备的人都可以获取该文件。

      或者在安装应用时随机生成(然后应该存储在哪里)?

      它至少会存储在 root 设备用户可以使用的地方。

      【讨论】:

      • 所以这意味着,购买 dexGuard 还是使用它?
      • @evildead:你可以尝试使用自己的加密,但你最终会追逐你的尾巴(你在哪里存储 那个 加密密钥?),你不太可能比 DexGuard 做得更好。我不知道有任何其他现成的解决方案。
      • 是的,建立在自己的加密之上是没有意义的。很遗憾没有通用的-free-解决方案。否则,我想,我已经在这里或在谷歌搜索时找到了它。 :)
      • @evildead 甚至 dexguard 都必须将它的解密秘密存储在您的应用程序中,并且(尽管到目前为止可能还没有发生,因为他们可能擅长隐藏它)该秘密在攻击者手中并且可以被发现。它的开源版本会破坏他们使用的所有秘密方式,并且仅仅免费提供此类软件是不可能的,因为您必须一直秘密改进它 - 一些人致力于隐藏而不是许多人致力于取消隐藏。
      猜你喜欢
      • 2017-06-11
      • 2018-10-20
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多