【问题标题】:How can I keep an API key secure from malicious attackers decompiling my app as well as detect malicious uses?如何保护 API 密钥免受恶意攻击者反编译我的应用程序以及检测恶意使用?
【发布时间】:2019-03-08 02:39:59
【问题描述】:

我目前正在开发一个使用 API 密钥和访问令牌通过 TLS 访问数据的 Android 应用程序。

我正在考虑通过 TLS 从诸如 Firebase 之类的东西上发送它,而不是以纯文本形式在应用程序本地存储秘密。我会将其加密发送,并使用一种相当模糊的解密方法。然后 API 机密将用于向 API 发出请求。

是否应考虑保护密钥?我担心恶意实体可能会反编译应用程序并插入他们自己的代码来找出我们隐藏 API 密钥的方法。

我不确定现在有人怎么能找到钥匙。我假设他们会反编译代码并在解密后重定向 API 机密。

最终,无论如何,我知道它可能会被黑客入侵,并且有人可能会发现 API 的秘密。然后,我如何检测到有人拥有 API 机密?除非他们拥有访问令牌,否则他们不能伤害其他用户,这是另一回事,但有没有众所周知的检测攻击的方法?恶意实体可能产生的唯一影响是向伪装成我们的 API 服务器发送许多请求,这会增加我们的计费,但这仍然应该受到保护。我可以轮换我的秘密,但如果他们已经有了找到它的方法,那么这对我来说没什么用。

总结一下: 什么被认为是最佳实践? API 机密是否应该保留在我们从 Firebase Functions 发出请求的服务器中?如何检测攻击,或者这取决于 API 到 API?如果检测到攻击,我是否必须强制用户更新到新版本才能发出请求并在新版本中以新方式隐藏数据?

我对此进行了很多思考,但我仍然有一些问题我自己或网上都没有找到答案。谢谢。

【问题讨论】:

  • 简短回答:除非您每次都强制用户显式登录,否则您无法保证 API 密钥的安全。但即便如此,用户仍然拥有会话密钥。

标签: android firebase security token secret-key


【解决方案1】:

在应用中存储 API 密钥是有问题的。您可以将其混淆或隐藏在计算中,但如果秘密足够有价值,就会有人提取它。

您正在考虑从服务器发送您的密钥。这使密钥远离应用程序包本身。您必须保护该通信,因此 TLS 是必须的,您应该更进一步,pin the connection 以避免中间人攻击。

我不会发送密钥本身,而是发送一个由您的 API 密钥签名的限时令牌。随着时间的推移,您需要发送不同的令牌,但 API 密钥永远不会直接暴露在应用程序上,您可以更改签名密钥而无需升级应用程序字段。如果令牌被盗,至少它只在有限的时间内有效。

您仍然需要确保不会将令牌发送给被篡改的应用程序,甚至不会发送给对您的协议进行逆向工程的机器人。您需要对已安装的应用程序包/代码进行身份验证,并检查安全的运行时环境(不在调试器中运行,没有 frida 或 xposed 等框架)。您可以将篡改检测添加到您的应用程序,但由于您已经向您的应用程序发送令牌,我认为这是设置挑战-响应协议的更好方法,该协议将以加密方式证明应用程序。这样,您而不是应用程序会做出实际的真实性决定。

有关用户和应用真实性的更多背景信息,请查看以 Mobile API Security Techniques 开头的 3 部分博客文章,或者如果您更喜欢视频,请查看 A Tour of Mobile API Underprotection。您还可以查看 approov.io,了解质询-响应证明和 JWT 令牌的商业实施。

【讨论】:

  • 谢谢。这非常有帮助。我希望你能澄清一些关于限时令牌的事情。如果客户端的应用程序需要 API 密钥来访问第三方 API,而他们所拥有的只是一个签名密钥,那将如何允许他们访问 API?另外,您是否有任何有关检查运行时环境的资源?感谢您分享您的知识。
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2017-02-07
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多