【问题标题】:iOS: Is there a safe way to include an API key in the code?iOS:有没有一种安全的方法可以在代码中包含 API 密钥?
【发布时间】:2014-03-13 01:05:57
【问题描述】:

亚马逊有一个适用于 iOS 的 AWS 开发工具包以及 several sample apps。在他们的示例中,他们将 API 凭据放在 Constants.h 文件中:

// Constants used to represent your AWS Credentials.
#define ACCESS_KEY_ID          @"CHANGE ME"
#define SECRET_KEY             @"CHANGE ME"

我担心这些可以被一个坚定的黑客提取。有什么方法可以安全地在应用中包含 API 密钥?

我看到的一个选项是包含我自己的服务器作为中间人:应用程序与我的服务器通信,我的服务器与 S3 通信。我可以看到这样做的价值,但仍然存在问题:我是否允许应用程序在我的服务器上进行 API 调用而无需任何身份验证?在应用程序中包含我自己的 API 密钥与包含 AWS API 密钥的问题相同。

【问题讨论】:

  • 如果它们存储在应用程序中(尤其是明文),则可以检索它们。您的应用程序能否在首次运行时检索密钥(使用 https),然后使用 KeychainItemWrapper 存储它。如果是这样,您还应该确保为访问钥匙串设置了适当的应用安全级别。
  • 这听起来像是个好主意。我什至可以想办法强制它在一周后过期,以防我需要更改为一组不同的凭据。

标签: ios amazon-web-services amazon-s3


【解决方案1】:

有几个凭据管理选项可帮助您避免在应用中嵌入凭据。第一个是 Web Identity Federation,它允许用户使用 Facebook、Google 或 Login With Amazon 登录您的应用程序。另一种选择是使用令牌自动售货机,它是一个服务器组件,用于向您的应用分发临时凭证。

在 AWS 移动开发博客:http://mobile.awsblog.com/post/Tx3UKF4SV4V0LV3/Announcing-Web-Identity-Federation

【讨论】:

  • 对于这个用例,令牌自动售货机听起来是最好的选择。谢谢!
【解决方案2】:

您可能希望使用 AWS STS 令牌创建临时写入凭证,而不是将密钥一直传递给客户端。您还可以为 CloudFront 端点创建 OAI,这样用户就不会直接访问 S3。

http://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

【讨论】:

    【解决方案3】:

    您可能会将它们以编码形式存储并根据需要对其进行编码。

    【讨论】:

    • 您要么依赖可逆的混淆,要么依赖加密。如果您加密了密钥,您仍然需要存储密钥以进行解密,这是一个递归问题。您将如何存储加密密钥?
    • @StephenJohnson 混淆密钥仍然比使用纯文本有很大改进。
    • @rmaddy - 很好的混淆方法:iosdevelopertips.com/cocoa/…
    【解决方案4】:

    你试过KeychainItemWrapper吗?

    KeychainItemWrapper *keychain = 
     [[KeychainItemWrapper alloc] initWithIdentifier:@"TestAppLoginData" accessGroup:nil];
    

    设置

    [keychain setObject:@"some text" forKey:(id)kSecAttrAccount];
    [keychain setObject:@"some pass" forKey:(id)kSecValueData];
    

    获取

    NSString *text = [keychain objectForKey:(id)kSecAttrAccount];
    NSString *pass = [keychain objectForKey:(id)kSecValueData];
    

    Keychain Services Programming Guide

    导入前Security.framwork

    我没有检查这个代码,如果有什么不起作用,请告诉我

    【讨论】:

    • 这不能回答问题。这如何隐藏密钥?这仍然需要密钥在代码中。
    • @rmaddy Is there any way to securely include API keys in an app?。可能我理解错了
    • 阅读问题中的代码。他的密码中有一把钥匙。他正在询问如何从代码中隐藏该密钥,以便黑客无法找到它。使用钥匙串不会隐藏应用代码中的钥匙。
    • 此答案与所提出的问题无关。
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多