一些消息来源建议将凭证存储在项目gradle.propertIEs文件中.从那里,凭据将作为BuildConfig.FIELD_name进行检索.我可以100%确定在逆向工程时无法从apk中提取这些内容吗?
我想到的另一种方法是使用非对称加密算法(使用公钥 – 私钥)加密凭证,并在需要时在运行时解密它们,但同样,我需要在应用程序内部的某处存储公钥以解密证书.这不再起作用,因为可以提取反编译apk的公钥.
我已经做了很多研究,但在这种情况下我找不到任何帮助.几乎每篇文章都指的是如何存储密码之类的凭证,但这不是相同的情况,因为我没有从服务器或运行时的任何地方检索我的秘密和凭据.进行API调用以获取凭据再次是一件坏事.
那么,我怎样才能尽可能安全地做到这一点?
我在等你的解决方案!谢谢
编辑:
密钥库并没有真正起作用,因为在将它们添加到密钥库之前我必须从某个地方获取秘密
From there the credentials will be retrIEved as BuildConfig.FIELD_name. Can I be 100% sure that those cannot be extracted from the apk when reverse-engineering it?
我100%肯定它可以被检索:). Java不会加密任何字符串,它们将全部存储为dex文件中的原始文本,随时可以进行grep.
从那里开始,接下来的步骤是使用静态密钥加密代码中的密钥.有些工具会为你做这件事,比如dexguard,Dasho,Dexprotector – 你也可以拿出自己的解决方案.This article解释得很好.
请记住,您自己的解决方案或第三方工具提供的解决方案可能很容易逆转:请参阅this example for dexguard.还请注意,在运行时解密时,这些凭据将在设备的RAM中清除,从而允许调试器轻松读取它们.
您的下一个最佳选择是在本机代码中使用加密字符串:更难以反向和跟踪,但仍然可行.
然后,您可以使用白盒加密技术,再次使用InsIDe Secure提议的第三方工具.这基本上将加密算法和密钥混合到混淆的本机代码中,这可能使您难以反向和难以调试加密/解密方法.在这里,您只能在应用中包含加密凭据,并且它们将在白盒内安全地解密.白盒通常非常安全(但不是不可能破解),但一旦解密,凭证将在设备的内存中清晰显示.这样可以更彻底地防止简单的反编译.
然后……如果不涉及硬件解决方案(KeyStore,嵌入式安全元素)和服务器来支持所有内容,我认为你不能做得更远.
总结以上是内存溢出为你收集整理的在Android App中存储机密和凭据全部内容,希望文章能够帮你解决在Android App中存储机密和凭据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)