好的做法:如何处理android / java中的密钥库密码?

Good Practice: How to handle keystore passwords in android/java?

本问题已经有最佳答案,请猛点这里访问。

假设keystore的密码不是由用户密码提供或绑定的(这或多或少意味着它只是某个代码中的一个字符串或数组[]),那么它是否是一个足够的保护,它只是无法或几乎无法从字节码中提取出来?

我知道密钥库的密码(jks/bks)只是用来验证密钥库的完整性。此外,很明显,我必须假设一个应用程序运行在一个或多或少可信的环境中是"安全的"。但无论如何,是否可以从apk文件中提取密码?

在应用程序的源代码中硬编码任何密码都是错误的,因此可能有一些想法,如何使其实际上不那么具有威胁性。例如,在安装应用程序的过程中,将密码配置在外部配置文件中还是随机生成(然后应将其存储在何处)会更好?


is it a sufficient protection that it just cannot or can only hardly be extracted out of the bytecode?

"充分"是一个主观术语,只有你能确定你觉得什么对你足够。

is it possible to extract the password just from the apk file?

是的,由于APK文件可以被反编译,未加密的网络对话可以被嗅探,等等。

how to make it actually less threatening

您可以为dexguard购买一个许可证并使用它,因为它将加密硬编码字符串,如密码。这是否值得额外辩护是你的决定。

would it be better to make the password configurable within an external configuration file

任何根设备的人都可以在文件中找到。

or generate it randomly during installation of the app (and where should it then be stored)?

它将至少存储在根设备用户可用的地方。


用密码加密密钥存储库是很常见的,但不必这样做。

在密钥库附近存储密码或多或少相当于拥有一个未加密的密钥库。那可能完全没问题。也就是说,在密钥存储文件受其他方法保护的服务器上,具有两个证书的未加密密钥存储区和私钥的情况并不少见。

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

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


尝试使用空值而不是密码(请参阅此问题)

1
2
3
4
5
6
7
8
9
10
11
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);