【发布时间】:2014-04-07 06:29:10
【问题描述】:
我有一个使用私钥的 C 函数,并希望防止任何人读出此密钥。 不仅来自二进制文件 - 还来自源存储库。密钥不是明文形式,但仍应尽可能难以访问它。 我的计划是将这个 c 文件编译为一个目标文件,并将这个目标文件(带有混淆的 privateKey 数组)放入源存储库。但我不确定我应该将密钥放在哪个存储类/范围中(本地堆栈变量、静态变量 - 本地/全局...)。
1.) 全局静态
static unsigned char const privateKey[] = {
0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
};
void myFunction(){
//do something with privateKey
}
2.) 局部堆栈变量
void myFunction(){
unsigned char const privateKey[] = {
0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
};
//do something with privateKey
}
3.) 局部静态
void myFunction(){
static unsigned char const privateKey[] = {
0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
};
//do something with privateKey
}
我刚刚用 nm 查看了这 3 个解决方案的目标文件 - 在第二个解决方案中,我什至没有看到键的符号(但我担心使用调试器很容易读取键,因为它是在运行时放置在堆栈上)。解决方案 3 在 nm 中看起来像:
00000000 T myFunction
00000200 t __6_privateKey.2
和解决方案 1 类似:
00000000 T myFunction
00000200 t privateKey
在哪里放置密钥最安全的存储类 - 或者在安全性方面根本没有区别?还有其他更安全的解决方案吗?
【问题讨论】:
-
没有安全存储类这样的东西,除非你用用户指定的密码保护它。然后它会有点安全。查看 PKSC12 (en.wikipedia.org/wiki/PKCS12) 了解一些信息。
-
您不必调用变量privateKey。你可以让它像 x 一样晦涩难懂。为了使代码可读,#define privateKey x。所以代码可以使用privateKey,但内部链接器变量是x。
标签: c security obfuscation reverse-engineering