Я считаю, что полностью скрыть учетные данные теоретически невозможно. То есть, если ваш скомпилированный код может их читать, то теоретически так может любой, имеющий доступ к скомпилированному коду. Но несовершенная безопасность все еще чего-то стоит. Я предполагаю, что большинство злоумышленников будут просто просматривать в двоичном коде строки, которые выглядят как секретные ключи, и не будут пытаться декомпилировать код и пытаться понять, как он работает, поэтому одним из способов скрытия учетных данных будет сохранение их в закодированном виде, а затем декодировать их по мере необходимости. Таким образом, алгоритм декодирования становится вашим ключом, и злоумышленник должен найти и понять его, чтобы извлечь ваши учетные данные.
Вот довольно простой способ сделать это, используя случайную маску 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];
Поскольку это общедоступный форум, вы можете изменить несколько вещей, например, сделать пэды разной длины, разделить их и объединить их с помощью кода, изменить их порядок и т. Д. Вы также можете сохранить пэд и клавишу. в дальних частях кода. По-настоящему опытный и преданный злоумышленник сможет найти ваш пароль, несмотря ни на что, но основная идея заключается в том, что большинство людей, сканирующих двоичный файл на наличие пароля, не найдут его как таковой.