iOS API 密钥:在发出 http 请求时,是否有真正安全的方法来保护您的 API 密钥?
iOS API Key: Is there an actual safe way to secure your API key when making http requests?
目前,我在登录并使用它发出 http 请求后从服务器获取了一个 API 密钥。我目前将 API 密钥存储在 iPhone 应用程序的数据库中。但是,我从同事那里听说我应该将它存储在 keychain
中。所以,我在 Whosebug 上搜索并看到了与此相关的问题。看来这根本不是存储 API 密钥的安全方法。
Secure keys in iOS App scenario, is it safe?
我不知道如何阻止黑客通过逆向工程从 iOS 应用程序获取 API 密钥。 Whosebug 上的一位用户基本上说它只会使事情过于复杂而几乎没有好处。
我需要找到 post,但有人建议您确保您正在发出安全的 API 请求(SSL 证书)并且您有办法删除 API 关键如果有人被黑了。
更安全的机制是 return 登录时的身份验证令牌。此身份验证令牌对用户应该是唯一的。如果您在后端有适当的授权和安全机制(以减轻 DDOS 攻击、注入攻击、用户访问其他用户的数据等),那么谁在乎他们是从钥匙串还是存储在何处的授权令牌?由于身份验证令牌与他们的帐户相关联,因此您可以使令牌无效,以便在用户恶意时停止工作。如果您在后端设置了正确的机制,您甚至可以完全禁用他们的帐户。
许多安全机制可以在后端自动执行。 AWS 等平台可以轻松配置为自动禁用对您的后端进行某些恶意调用的帐户。
正如@jake 已经指出的那样,您应该使用仅绑定到用户的令牌而不是所有用户的 Api 密钥,但是可以进行其他增强以在执行以下操作时进一步保护您的应用程序http 请求。
用户令牌可以是签名的 JWT 令牌,然后您可以使用证书固定增强服务器与应用程序之间通信的安全性,以防止中间人攻击。
OAUTH2 的使用和隐藏秘密等其他技术可用于增强应用程序的安全性,您可以阅读更多相关信息here。
请记住,证书固定 can be bypassed by hooking frameworks such as Xposed 包含特定于绕过固定的模块,但还有另一层安全性,您不应该丢弃它,因为它会增加破解设备上的应用程序所需的努力并将保护您的应用免受中间人攻击。
为了您的应用程序和后端之间的最终安全,您应该使用应用程序完整性证明服务,这将在 运行 时保证您的应用程序未被篡改或 运行通过使用集成在您的应用程序中的 SDK 和云中的服务 运行 在已获得 root 权限的设备中运行。
在成功证明应用程序完整性后,将颁发一个 JWT 令牌并使用只有您的应用程序后端和云中的证明服务知道的秘密进行签名,如果失败,则使用伪造的 JWT 进行签名App后台不知道的secret,让App后台只有在可以验证JWT token中的签名时才服务请求,验证失败时拒绝请求。
一旦应用程序不知道云认证服务使用的秘密,即使应用程序被篡改,也无法在 运行 时间对其进行逆向工程,运行宁获得 root 权限的设备或通过成为中间人攻击目标的连接进行通信。
您可以在 Approov 中找到这样的服务,它具有适用于多个平台的 SDK,包括 IOS。集成还需要在 App 后端代码中进行少量检查以验证 JWT 令牌,以便后端可以保护自己免受欺诈性使用。
Token Based Authentication
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
Pinning is the process of associating a host with their expected X509 certificate or public key. Once a certificate or public key is known or seen for a host, the certificate or public key is associated or 'pinned' to the host. If more than one certificate or public key is acceptable, then the program holds a pinset (taking from Jon Larimer and Kenny Root Google I/O talk). In this case, the advertised identity must match one of the elements in the pinset.
The OAuth 2.0 authorization framework enables a third-party
application to obtain limited access to an HTTP service, either on
behalf of a resource owner by orchestrating an approval interaction
between the resource owner and the HTTP service, or by allowing the
third-party application to obtain access on its own behalf. This
specification replaces and obsoletes the OAuth 1.0 protocol described
in RFC 5849.
免责声明:我在 Approov 工作。
目前,我在登录并使用它发出 http 请求后从服务器获取了一个 API 密钥。我目前将 API 密钥存储在 iPhone 应用程序的数据库中。但是,我从同事那里听说我应该将它存储在 keychain
中。所以,我在 Whosebug 上搜索并看到了与此相关的问题。看来这根本不是存储 API 密钥的安全方法。
Secure keys in iOS App scenario, is it safe?
我不知道如何阻止黑客通过逆向工程从 iOS 应用程序获取 API 密钥。 Whosebug 上的一位用户基本上说它只会使事情过于复杂而几乎没有好处。
我需要找到 post,但有人建议您确保您正在发出安全的 API 请求(SSL 证书)并且您有办法删除 API 关键如果有人被黑了。
更安全的机制是 return 登录时的身份验证令牌。此身份验证令牌对用户应该是唯一的。如果您在后端有适当的授权和安全机制(以减轻 DDOS 攻击、注入攻击、用户访问其他用户的数据等),那么谁在乎他们是从钥匙串还是存储在何处的授权令牌?由于身份验证令牌与他们的帐户相关联,因此您可以使令牌无效,以便在用户恶意时停止工作。如果您在后端设置了正确的机制,您甚至可以完全禁用他们的帐户。
许多安全机制可以在后端自动执行。 AWS 等平台可以轻松配置为自动禁用对您的后端进行某些恶意调用的帐户。
正如@jake 已经指出的那样,您应该使用仅绑定到用户的令牌而不是所有用户的 Api 密钥,但是可以进行其他增强以在执行以下操作时进一步保护您的应用程序http 请求。
用户令牌可以是签名的 JWT 令牌,然后您可以使用证书固定增强服务器与应用程序之间通信的安全性,以防止中间人攻击。
OAUTH2 的使用和隐藏秘密等其他技术可用于增强应用程序的安全性,您可以阅读更多相关信息here。
请记住,证书固定 can be bypassed by hooking frameworks such as Xposed 包含特定于绕过固定的模块,但还有另一层安全性,您不应该丢弃它,因为它会增加破解设备上的应用程序所需的努力并将保护您的应用免受中间人攻击。
为了您的应用程序和后端之间的最终安全,您应该使用应用程序完整性证明服务,这将在 运行 时保证您的应用程序未被篡改或 运行通过使用集成在您的应用程序中的 SDK 和云中的服务 运行 在已获得 root 权限的设备中运行。
在成功证明应用程序完整性后,将颁发一个 JWT 令牌并使用只有您的应用程序后端和云中的证明服务知道的秘密进行签名,如果失败,则使用伪造的 JWT 进行签名App后台不知道的secret,让App后台只有在可以验证JWT token中的签名时才服务请求,验证失败时拒绝请求。
一旦应用程序不知道云认证服务使用的秘密,即使应用程序被篡改,也无法在 运行 时间对其进行逆向工程,运行宁获得 root 权限的设备或通过成为中间人攻击目标的连接进行通信。
您可以在 Approov 中找到这样的服务,它具有适用于多个平台的 SDK,包括 IOS。集成还需要在 App 后端代码中进行少量检查以验证 JWT 令牌,以便后端可以保护自己免受欺诈性使用。
Token Based Authentication
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
Pinning is the process of associating a host with their expected X509 certificate or public key. Once a certificate or public key is known or seen for a host, the certificate or public key is associated or 'pinned' to the host. If more than one certificate or public key is acceptable, then the program holds a pinset (taking from Jon Larimer and Kenny Root Google I/O talk). In this case, the advertised identity must match one of the elements in the pinset.
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849.
免责声明:我在 Approov 工作。