在iOS应用程序中存储包含的AWS凭证的最佳位置

时间:2011-08-10 00:53:44

标签: ios amazon-web-services

我计划将AWS SDK for iOS用于即将推出的项目。我需要使用打包的应用程序存储AWS的凭据。放置它们的最安全的地方在哪里?我知道将它们存储在pList中是个坏主意。将它硬编码到一个将被编译的类中更好吗?那里有风险吗?

3 个答案:

答案 0 :(得分:16)

我认为完全隐藏凭据在理论上是不可能的。也就是说,如果您的编译代码可以读取它们,那么理论上任何人都可以访问已编译的代码。但不完善的安全性仍然值得。我猜大多数攻击者只会通过二进制文件查看看起来像密钥的字符串,而不是去解码代码并尝试解释它是如何工作的麻烦,因此隐藏凭据的一种方法是存储它们采用编码形式,然后根据需要对其进行解码。通过这种方式,解码算法成为您的密钥,攻击者必须找到并理解它才能提取您的凭据。

这是使用随机XOR蒙版进行此操作的一种相当简单的方法。用您的密码替换以下伪密码,并记住保留NULL终止符(\ 0)。编译并运行此代码作为独立程序:

#include <stdio.h>

#define PAD_LENGTH 32

int main() {
  int i;
  char c;

  // start with the password
  char password[PAD_LENGTH] = "My AWS Password\0";

  // make a random pad to encrypt it
  printf("PAD:\n{");
  char pad[PAD_LENGTH];
  for (i = 0; i < PAD_LENGTH; i++) {
    c = arc4random() & 0xFF;
    pad[i] = c;
    printf("%#02x", c & 0xFF);
    if (i < PAD_LENGTH - 1) printf(",");
  }
  printf("}\n");

  // make an encrypted version of the password
  printf("KEY:\n{");
  for (i = 0; i < PAD_LENGTH; i++) {
    c = pad[i] ^ password[i];
    printf("%#02x", c & 0xFF);
    if (i < PAD_LENGTH - 1) printf(",");
  }
  printf("}\n");

  return(0);
}

然后将生成的pad和key复制到这样的代码中(实际上它将包含在你的应用程序中):

#define PAD_LENGTH 32

char pad[PAD_LENGTH] = {0x83,0x26,0x8a,0x8b,0xee,0xab,0x6,0xed,0x2e,0x99,0xff,0x23,0x7f,0xef,0xc8,0x8,0x6b,0x8e,0xa4,0x64,0x6d,0xb,0x7,0xd2,0x6a,0x39,0x60,0xa4,0xa9,0xad,0xea,0xb8};
char key[PAD_LENGTH] = {0xce,0x5f,0xaa,0xca,0xb9,0xf8,0x26,0xbd,0x4f,0xea,0x8c,0x54,0x10,0x9d,0xac,0x8,0x6b,0x8e,0xa4,0x64,0x6d,0xb,0x7,0xd2,0x6a,0x39,0x60,0xa4,0xa9,0xad,0xea,0xb8};
for (int i = 0; i < PAD_LENGTH; i++) {
  key[i] = key[i] ^ pad[i];
}
NSString *password = [NSString stringWithCString:key encoding:NSASCIIStringEncoding];

由于这是在公共论坛上,您可能想要更改一些内容,例如使垫子长度不同,将它们分开并用代码重新加入它们,重新排序等等。您还可以存储垫和键在代码的远端部分。一个真正熟练和专注的攻击者无论如何都能找到你的密码,但基本的想法是大多数人扫描二进制文件的密码都不会发现它。

答案 1 :(得分:1)

您是否查看过Data Protection API?

What are the new "iOS data protection APIs"?

根据您的安全需求,有多种选择。

这个问题也可能有所帮助。

Data Protection on iOS

今年会议的视频很有用。

http://developer.apple.com/videos/wwdc/2010

答案 2 :(得分:1)

您应该使用 AWS身份和访问管理(IAM)http://aws.amazon.com/iam/

您可以在http://aws.amazon.com/articles/4611615499399490上找到有关移动应用程序中的AWS凭据管理的更多信息