Java 安全地存储api凭据

Java 安全地存储api凭据,java,android,security,Java,Android,Security,我如何安全地存储API凭据,如身份验证密钥、google map API密钥,目前我已将该凭据存储在strings.xml.KeygenratorSpec中,要求最低API级别为23。是否有任何安全存储的方法?任何帮助都会更有帮助。我已经被困了2天,但不知道。简短回答:你做不到 更详细的回答:您可以使用模糊处理,以使查找API凭据变得困难,但是,有足够的时间和一些技能的人仍然会找到并破坏它。使用KeyGenerator也无济于事。我假设您计划加密/解密API凭据。您仍然需要在应用程序中存储或检索

我如何安全地存储API凭据,如身份验证密钥、google map API密钥,目前我已将该凭据存储在strings.xml.KeygenratorSpec中,要求最低API级别为23。是否有任何安全存储的方法?任何帮助都会更有帮助。我已经被困了2天,但不知道。

简短回答:你做不到

更详细的回答:您可以使用模糊处理,以使查找API凭据变得困难,但是,有足够的时间和一些技能的人仍然会找到并破坏它。使用KeyGenerator也无济于事。我假设您计划加密/解密API凭据。您仍然需要在应用程序中存储或检索密钥。因此,同样的问题仍然存在,在能够访问您的凭据之前,用户只需再找到一个字符串

混淆可能是你最好的机会。当然,它不是防弹的,但如果它足够复杂,它可能会延迟或降低试图破坏您的应用程序的人的积极性。您可以使用proguard混淆应用程序代码(如果您不想为更高级的东西付费),但是它不会混淆字符串。为此,您必须使用其他技术。你可以在网上找到很多例子,你也可以使用自己的模糊处理层。我不认为你会找到任何好的建议或标准,以便做到这一点。当然,不管你怎么努力,恢复还是迟早的事

编辑:

这是一个很好的配置proguard的教程:(请注意所包含的内容,否则在生成apk时可能会崩溃)

关于字符串混淆,您可以使用类似的方法:但是您仍然需要一些密码,因此可以进行解密。如果将现有字符串用作密码(您已经在应用程序中使用的字符串),并将其与代码混淆相结合,可能会让人感到困惑。在各种文件/资源中隐藏字符串的一部分,并在需要创建字符串时将它们组合在一起,这可能会增加更多的混乱。然而,如果你把它弄得太复杂,它可能很容易被发现。例如,如果您的strings.xml仅包含1个加密字符串(不可读),则很可能这就是您试图保护的字符串。遵循此操作将获得此信息。因此,在我看来,没有最佳/良好实践。通过在线查看,您可以获得一些想法,但我建议您自己判断隐藏它的最佳方式(不太明显),这取决于您的代码和应用程序结构。但无论如何,这只会欺骗没有经验/懒惰的攻击者和自动化工具


我经常做的另一件事是,如果启用了调试,或者apk文件未由我本人签名,则不允许运行代码的某些部分。这些对策也不是防弹的,但可能会降低懒惰攻击者的积极性。这里有一个很好的指南,告诉你如何做这件事和其他事情:

@jackgu1988如果你有,你能提供任何例子链接吗