良好实践:如何在安卓/java中处理密钥库密码?
假设密钥库的密码不是由用户密码提供或绑定的(这或多或少意味着它只是代码中某个地方的字符串或数组[]),它是否是一种足够的保护,以至于它不能或只能很难从字节码中提取出来
我知道密钥库(JKS/BKS)的密码只是用来验证密钥库的完整性。此外,很明显,我必须假设一个应用程序在一个或多或少受信任的环境中运行是“安全的”。但无论如何,是否可以仅从apk文件中提取密码
在应用程序的源代码中硬编码任何密码都是错误的,因此可能有一些想法,如何使它实际上不那么具有威胁性。 例如,是否最好在外部配置文件中配置密码,或在安装应用程序时随机生成密码(然后将密码存储在何处)
# 1 楼答案
尝试使用null而不是密码(请参阅this question)
# 2 楼答案
“充分”是一个主观术语;只有你才能决定你觉得什么对你来说是足够的
是的,因为可以反编译APK文件,可以嗅探未加密的网络对话,等等
您可以为DexGuard购买一个许可证并使用它,因为这将加密硬编码字符串,如您的密码。这是否值得额外的辩护是你的决定
任何使用该设备的人都可以获取该文件
它至少会存储在根设备用户可用的地方
# 3 楼答案
使用密码加密密钥库是很常见的,但这不是必需的
将密码存储在密钥库附近或多或少相当于拥有一个未加密的密钥库。那可能完全可以。也就是说,在密钥存储库文件受其他方式保护的服务器上,具有未加密密钥存储库(同时具有证书和私钥)的情况并不少见
在这里,您似乎试图防范的攻击类型是,如果有人能够更改密钥库的内容。密码可用于验证密钥库的完整性,但前提是攻击者不知道密码。它无法想象攻击者可以访问您的密钥库但无法访问应用程序的字节码或应用程序的其他配置的典型场景
Android应用程序的文件系统是合理安全的,但无论如何都不是防弹的。如果您不信任该文件系统,则需要使用用户键入的密码或从设备之外的其他地方获取的密码来加密密钥库。另一方面,如果您信任文件系统,那么实际上根本不必加密密钥库(或者您可以使用众所周知的密码加密密钥库,如果这样可以简化开发)