dtu*_*net 7 amazon-web-services ios
我计划将AWS SDK for iOS用于即将推出的项目.我需要使用打包的应用程序存储AWS的凭据.放置它们的最安全的地方在哪里?我知道将它们存储在pList中是个坏主意.将它硬编码到一个将被编译的类中更好吗?那里有风险吗?
Jes*_*sen 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);
}
Run Code Online (Sandbox Code Playgroud)
然后将生成的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];
Run Code Online (Sandbox Code Playgroud)
由于这是在公共论坛上,你可能想要改变一些东西,比如使垫子长度不同,分开它们并用代码重新加入它们,重新排序等等.你也可以将垫子和钥匙存放在远处的部分的代码.一个真正熟练和专注的攻击者无论如何都能找到你的密码,但基本的想法是大多数人扫描二进制文件的密码都不会发现它.
| 归档时间: |
|
| 查看次数: |
2843 次 |
| 最近记录: |