安全地存储api凭证

时间:2017-04-26 14:00:21

标签: java android security

如何安全地存储API凭据,例如身份验证密钥,Google地图API密钥,目前我已将该凭据存储在strings.xml.KeygenratorSpec中,要求最低API级别为23,是否有任何方法可以安全地存储任何帮助将更有帮助我被困2天但不知道。

1 个答案:

答案 0 :(得分:0)

简短的回答:你不能这样做。

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

混淆可能是你最好的机会。当然,它不是防弹,但如果它足够复杂,它可能会延迟或消极试图破坏你的应用程序的人。您可以使用proguard来混淆您的应用程序代码(如果您不想为更高级的东西付费),但它不会混淆字符串。你将不得不使用其他技术。您可以在线找到大量示例,也可以使用自己的混淆层。我不认为你会找到任何好的建议或标准来做到这一点。当然,无论你怎么努力,一个人回归仍然是个时间问题。

修改

这是一个配置proguard的好教程:http://wiebe-elsinga.com/blog/obfuscating-for-android-with-proguard/(请注意包含的内容,否则在生成apk时可能会崩溃)

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

我经常做的另一件事是,如果启用了调试,或者我自己没有签名apk文件,则不允许运行代码的某些部分。这些对策也不是防弹措施,但可能会使懒惰的攻击者失去动力。以下是有关如何执行此操作和其他事项的良好指南:https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app