android - 如何保护 API 密钥免受恶意攻击者反编译我的应用程序以及检测恶意使用?
问题描述
我目前正在开发一个使用 API 机密和访问令牌通过 TLS 访问数据的 android 应用程序。
我正在考虑通过 TLS 从诸如 Firebase 之类的东西通过 TLS 将其以纯文本形式存储在本地应用程序中,而不是在本地存储秘密。我会把它加密发送,并有一种相当模糊的解密方法。然后 API 机密将用于向 API 发出请求。
是否应考虑保护密钥?我担心的是恶意实体可能会反编译应用程序并插入他们自己的代码来找出我们隐藏 API 密钥的方法。
我不确定现在有人怎么能找出钥匙。我假设他们会反编译代码并在解密后重定向 API 机密。
最终,无论如何,我明白它可能被黑客入侵,并且有人可以发现 API 的秘密。然后,我如何检测到有人拥有 API 机密?除非他们拥有访问令牌,否则他们不能伤害其他用户,这是另一回事,但有没有众所周知的检测攻击的方法?恶意实体可能产生的唯一影响是向伪装成我们的 API 服务器发送许多请求,这会增加我们的计费,但这仍然应该受到保护。我可以轮换我的秘密,但如果他们已经有了找到它的方法,那么这对我没有多大用处。
总结一下:什么是最佳实践?API 机密是否应该保留在我们从 Firebase Functions 发出请求的服务器中?如何检测攻击,或者这取决于 API 到 API?如果检测到攻击,我是否必须强制用户更新到新版本以发出请求并在新版本中以新方式隐藏数据?
我对此进行了很多思考,但我仍然有一些问题我自己或网上都没有找到答案。谢谢你。
解决方案
在应用程序中存储 API 密钥是有问题的。你可以混淆它或将它隐藏在计算中,但如果这个秘密足够有价值,就会有人提取它。
您正在考虑从服务器发送您的密钥。这使密钥远离应用程序包本身。您必须保护该通信,因此 TLS 是必须的,并且您应该更进一步并固定连接以避免中间人攻击。
我不会发送密钥本身,而是发送一个由您的 API 密钥签名的限时令牌。随着时间的推移,您需要发送不同的令牌,但 API 密钥永远不会直接暴露在应用程序上,您可以更改签名密钥而无需升级应用程序字段。如果令牌被盗,至少它只在有限的时间内有效。
你仍然需要确保你不会将令牌发送到被篡改的应用程序,甚至是对你的协议进行逆向工程的机器人。您需要对已安装的应用程序包/代码进行身份验证,并检查安全的运行时环境(不在调试器中运行,没有 frida 或 xposed 等框架)。您可以将篡改检测添加到您的应用程序,但由于您已经向您的应用程序发送令牌,我认为这是设置挑战-响应协议的更好方法,该协议将以加密方式证明应用程序。这样,您而不是应用程序会做出实际的真实性决定。
有关用户和应用真实性的更多背景信息,请查看包含 3 部分的博客文章,从移动 API 安全技术开始,或者如果您更喜欢视频,请查看移动 API 保护不足之旅。您还可以查看approov.io,了解质询-响应证明和 JWT 令牌的商业实施。
推荐阅读
- regex - 涉及 grep 的相同 bash 脚本在一台机器上成功,但在另一台机器上失败
- c - 与静态库链接
- angular - Angular 9 + FontAwesome 0.6:“错误 NG8001:'fa-icon' 不是已知元素”
- ipfs - 如何避免 IPFS DNSLINK 的名称冲突?
- swift - 我的协议不起作用,它有什么问题?
- python - python中大列表的反向操作很慢
- python-3.x - ValueError: 层 simple_rnn_1 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,50]
- html - 在 css 中使用 Calc() 函数仅填充左侧和顶部
- python - 不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
- javascript - 如何将 node.js 服务器应用程序编译为可执行文件?