Gab*_*abi 8 security encryption android credentials amazon-web-services
我正在使用AWS Cognito,我需要在我的Android应用程序中的某处存储一些凭据和机密,以便稍后使用它们来登录/注册/注销用户.
一些消息来源建议将凭证存储在项目gradle.properties文件中.从那里,凭证将被检索为BuildConfig.FIELD_NAME.我可以100%确定在逆向工程时无法从apk中提取这些内容吗?
我想到的另一种方法是使用非对称加密算法(使用公钥 - 私钥)加密凭证,并在需要时在运行时解密它们,但同样,我需要在我的应用程序中的某个位置存储公钥以解密证书.这不再起作用,因为可以提取反编译apk的公钥.
我已经做了很多研究,但在这种情况下我找不到任何帮助.几乎每篇文章都指的是如何存储密码等凭证,但这不是相同的情况,因为我没有从服务器或运行时的任何地方检索我的秘密和凭据.进行API调用以获取凭据再次是一件坏事.
那么,我怎样才能尽可能安全地做到这一点?我在等你的解决方案!谢谢
编辑: 密钥库并没有真正起作用,因为在将它们添加到密钥库之前我必须从某处获取秘密
小智 6
这实际上完全取决于您需要或希望您的应用程序有多安全,以及这些凭据的敏感程度。由于无法从服务器端存储和检索它们,因此最好的办法是将它们嵌入代码中的某个位置。APK 可以非常轻松地反编译,因此您的凭据始终可以通过某种方式访问。真正的问题是您希望逆向过程有多困难。
从那里凭据将被检索为 BuildConfig.FIELD_NAME。我可以 100% 确定在逆向工程时无法从 apk 中提取这些吗?
我 100% 确定它可以被检索:)。Java 不会加密任何字符串,它们都将作为原始文本存储在 dex 文件中,准备进行 grep 处理。
从那里开始,您的下一步将是使用静态密钥加密代码中的密钥。有些工具会为您做到这一点,例如 DexGuard、Dasho、Dexprotector——您也可以提出自己的解决方案。这篇文章解释得很好。
请记住,您自己的解决方案或第三方工具提供的解决方案可能很容易逆转:请参阅此示例了解 DexGuard。另请注意,在运行时解密时,这些凭据将在设备的 RAM 中清晰可见,从而允许调试器轻松读取它们。
您的下一个最佳选择是在本机代码中使用加密字符串:更难逆转和追踪,但仍然可行。
然后,您可以使用白盒密码术,再次使用 Inside Secure 提出的第三方工具。这基本上会将加密算法和密钥混合到混淆的本机代码中,这可能会使您难以逆转和难以调试加密/解密方法。在这里,您将只在您的应用程序中包含加密凭据,并且它们将在白盒中安全地解密。白盒通常非常安全(但并非不可能破解),但一旦解密,凭据将在设备的内存中清晰可见。这将更彻底地防止简单的反编译。
然后……我认为如果不涉及硬件解决方案(KeyStore、嵌入式安全元件)和服务器来备份所有内容,您就无法再进一步。
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |