我计划将AWS SDK for iOS用于即将推出的项目。我需要使用打包的应用程序存储AWS的凭据。放置它们的最安全的地方在哪里?我知道将它们存储在pList中是个坏主意。将它硬编码到一个将被编译的类中更好吗?那里有风险吗?
答案 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"?
根据您的安全需求,有多种选择。
这个问题也可能有所帮助。
今年会议的视频很有用。
答案 2 :(得分:1)
您应该使用 AWS身份和访问管理(IAM):http://aws.amazon.com/iam/
您可以在http://aws.amazon.com/articles/4611615499399490上找到有关移动应用程序中的AWS凭据管理的更多信息