iOS:有没有一种安全的方式在代码中包含API密钥?

Amazon拥有适用于iOS的AWS开发工具包,以及多个示例应用程序 。 在他们的示例中,他们将API凭证放在一个Constants.h文件中:

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

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

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

有几个凭证pipe理选项可以帮助您避免在应用中embedded凭据。 首先是Web Identity Federation,它允许用户通过Facebook,Google或者使用Amazonlogin到您的应用程序。 另一个select是使用令牌自动售货机,这是一个服务器组件,将临时凭证分发给您的应用程序。

AWS Mobile开发博客上提供了相关文档和代码示例的高级概述: http : //mobile.awsblog.com/post/Tx3UKF4SV4V0LV3/Announcing-Web-Identity-Federation

您可能需要使用AWS STS令牌创build临时写入凭据,而不是将密钥一直传递到客户端。 您也可以为CloudFront端点创buildOAI,这样用户不需要直接访问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的

可能你colud存储在一个编码的forms,并根据需要进行编码。

你有没有试过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]; 

钥匙串服务编程指南

在导入Security.framwork之前

我没有检查这个代码,如果有什么不工作,让我知道