在 iOS 代码中嵌入 API 凭据

Posted

技术标签:

【中文标题】在 iOS 代码中嵌入 API 凭据【英文标题】:Embed API credentials in iOS code 【发布时间】:2012-10-14 12:21:01 【问题描述】:

我必须从 ios 代码调用支付网关 API。问题是它需要商家凭据,我觉得将商家凭据嵌入代码中是不安全的。如果有人以某种方式对代码进行逆向工程并获得凭据,那么客户端就死了。有什么建议吗?

我发现这篇帖子 Does Apple modify iOS application executables on apps submitted to the App Store? 说应用程序二进制文件默认由 Apple 加密。这是否意味着我可以安全地将凭据嵌入代码中?

【问题讨论】:

没有。永远不要在未加密的代码(字符串、plist)中嵌入关键资源。 plist 不仅是简单的捆绑资源(例如未加密),而且 Objective-C 代码的动态特性意味着它可以很容易地进行逆向工程。再加上const NSStrings* 在二进制级别缓存这一事实。 那你有什么建议呢?我应该加密凭据并将它们放入 plist 文件中。假设加密算法和密钥在代码中并且是安全的,因为二进制是由苹果加密和签名的,并且类不能被逆向工程。还是别的什么? 实际上并没有一种方法可以以某种方式嵌入凭据,以使决心获取它们的人无法恢复它们。我还看到有人认为使用 HTTPS 传输机密可以保证它们的安全,但事实并非如此,因为您可以使用诸如 Charles 之类的代理来记录网络流量(您必须在设备上安装证书,以便信任代理)。 【参考方案1】:

不!与其将凭据添加到 iOS 应用程序,您应该考虑设置一个处理与 API 交互的服务器,您正在谈论,并让应用程序仅与您的服务器交互。因此,您可以将 API 密钥存储在您的服务器上,并可以限制服务器端用户的可能操作(这将更难滥用)。

【讨论】:

这不是把罐子踢倒了吗?那么,您如何确保您的应用程序是唯一可以向该新服务器发出请求的应用程序? 没有。如果您获得该服务的 API 密钥,您就可以使用该服务做所有可能的事情。如果您将密钥存储在服务器上,服务器软件可以限制可以执行的操作。如果您的服务也使用身份验证,您还可以查明何时有人试图滥用您的服务。 好点。这似乎是一个很好的风险缓解措施,特别是对于授予“一揽子”密钥的服务,您可以在其中执行用户可能被授权执行的任何操作,而实际上您的应用实际上只需要执行其中的一部分。

以上是关于在 iOS 代码中嵌入 API 凭据的主要内容,如果未能解决你的问题,请参考以下文章

将带有嵌入式凭据 URL 的 cURL 请求转换为获取请求 [重复]

在 Flutter 应用程序中存储 API 凭据

尝试保存凭据时,使用Google Drive API库和Play with Java会冻结/锁定应用程序

对于使用错误凭据执行的登录请求,REST API 应返回啥状态代码?

从 SDK 获取 Paypal API 凭证

在 Java 代码中嵌入密码的最安全方法是啥? [复制]