Лучшее место для хранения включенных учетных данных AWS в приложении iOS - PullRequest
7 голосов
/ 10 августа 2011

Я планирую использовать AWS SDK для iOS для предстоящего проекта. Мне нужно хранить учетные данные для AWS с упакованным приложением. Где наиболее безопасное место для их размещения? Я знаю, что хранить их в pList было бы плохой идеей. Лучше просто «жестко закодировать» его в класс, который будет скомпилирован? Есть ли риск там?

Ответы [ 3 ]

16 голосов
/ 23 августа 2011

Я считаю, что полностью скрыть учетные данные теоретически невозможно. То есть, если ваш скомпилированный код может их читать, то теоретически так может любой, имеющий доступ к скомпилированному коду. Но несовершенная безопасность все еще чего-то стоит. Я предполагаю, что большинство злоумышленников будут просто просматривать в двоичном коде строки, которые выглядят как секретные ключи, и не будут пытаться декомпилировать код и пытаться понять, как он работает, поэтому одним из способов скрытия учетных данных будет сохранение их в закодированном виде, а затем декодировать их по мере необходимости. Таким образом, алгоритм декодирования становится вашим ключом, и злоумышленник должен найти и понять его, чтобы извлечь ваши учетные данные.

Вот довольно простой способ сделать это, используя случайную маску 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);
}

Затем скопируйте сгенерированный пэд и введите код, подобный следующему (который фактически будет включен в ваше приложение):

#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 голос
/ 22 августа 2011

Вы должны использовать Управление идентификацией и доступом AWS (IAM) : http://aws.amazon.com/iam/

Более подробную информацию о Управление учетными данными AWS в мобильных приложениях можно получить on http://aws.amazon.com/articles/4611615499399490

1 голос
/ 10 августа 2011

Вы смотрели на API защиты данных?

Что такое новые "API защиты данных iOS"?

Существуют различные варианты в зависимости от ваших потребностей безопасности.

Этот вопрос также может помочь.

Защита данных на iOS

Видео с конференции этого года было полезным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...