我正在使用AWS认知,我需要在我的android应用程序中的某个地方存储一些凭证和秘密,以便稍后使用它们来登录/注册/注销用户。
一些消息来源建议将凭证存储在项目gradle.properties文件中。从那里,凭据将被检索为BuildConfig.FIELD_NAME
。我是否可以100%地确定,当反向工程时,不能从apk中提取这些信息?
我考虑的另一种方法是使用非对称加密算法(使用公共私钥)加密凭证,并在需要时在运行时对它们进行解密,但同样,我需要将公钥存储在我的应用程序中的某个地方,以便解密凭据。这不能再次工作,因为公钥可以被解压缩,反编译apk。
我对此做了很多研究,但在这件事上我没有发现任何帮助我的地方。几乎每一篇文章都提到如何存储密码之类的凭据,但情况并非如此,因为我没有从服务器或运行时的任何地方检索我的机密和凭据。发出API调用以获取凭据也是一件坏事。
那么,我怎样才能尽可能安全地做到这一点呢?我在等你的解决方案!谢谢
编辑:密钥存储实际上不起作用,因为我必须在将它们添加到密钥存储之前从某个地方获取它们
发布于 2018-09-13 01:25:25
这实际上取决于您需要或希望您的应用程序有多安全,以及这些凭据有多敏感。因为从服务器端存储和检索它们不是一种选择,所以最好的选择是将它们嵌入代码的某个地方。APK可以非常容易地解压缩,因此您的凭据总是可以以某种方式访问的。真正的问题是你希望倒车的过程有多困难。
从那里,凭据将被检索为BuildConfig.FIELD_NAME。我是否可以100%地确定,当反向工程时,不能从apk中提取这些信息?
我百分之百肯定它可以被检索到:)。Java不会加密任何字符串,它们都将作为原始文本存储在dex文件中,准备成为grep的。
从这里开始,接下来的步骤是使用静态密钥加密代码中的密钥。有些工具会为你做到这一点,比如DexGuard、Dasho、Dexprotector --你也可以想出自己的解决方案。这篇文章很好地解释了这一点。
请记住,无论是您自己的解决方案,还是第三方工具提供的解决方案,都可能很容易逆转:参见这个例子 for DexGuard。还请注意,在运行时解密时,这些凭据将在设备的RAM中清除,从而允许调试器轻松读取它们。
下一个最佳选择是在本机代码中使用加密的字符串:更难反转和跟踪,但仍然可行。
然后,您可以使用白盒加密技术,也可以使用第三方工具,如Inside Secure提出的工具。这将从本质上将加密算法和密钥混合到混淆的本机代码中,这可能会使您难以逆转&难以调试加密/解密方法。在这里,您只需要在应用程序中包含加密的凭据,并且它们将在白框中被安全地解密。白盒通常是非常安全的(但并非不可能破解),但一旦解密,凭据将在设备的内存中清晰。这将更彻底地防止简单的反编译。
然后..。我认为,如果没有硬件解决方案(KeyStore,嵌入式安全元素)和支持一切的服务器,您就不能做得更深入了。
https://stackoverflow.com/questions/52309426
复制相似问题