哪个存储类可以防止私钥的逆向工程?

Con*_*tin 0 c security obfuscation reverse-engineering

我有一个C函数,它使用私钥,并希望防止任何人读出此密钥.不仅来自二进制 - 而且来自源存储库.关键不是明文,但仍然应该尽可能难以访问它.我的计划是将此c文件编译为目标文件,并将此目标文件(带有混淆的privateKey数组)放入源存储库中.但我不确定我应该在哪个存储类/范围内放置密钥(本地堆栈变量,静态变量 - 本地/全局,...).

1.)全球静态

static unsigned char const privateKey[] = {
  0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
};
void myFunction(){
  //do something with privateKey
}
Run Code Online (Sandbox Code Playgroud)

2.)本地Stackvariable

void myFunction(){
  unsigned char const privateKey[] = {
    0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
  };
  //do something with privateKey
}
Run Code Online (Sandbox Code Playgroud)

3.)局部静态

void myFunction(){
  static unsigned char const privateKey[] = {
    0x44, 0x8e, 0x54, 0xae, 0x64, 0x74, 0xbe, ...
  };
  //do something with privateKey
}
Run Code Online (Sandbox Code Playgroud)

我只是用nm观察了这3个解决方案的目标文件 - 在第二个解决方案中,我甚至没有看到键的符号(但我担心使用调试器很容易读取密钥,因为它放在了在运行时堆栈).解决方案3在nm中看起来像:

00000000 T myFunction
00000200 t __6_privateKey.2
Run Code Online (Sandbox Code Playgroud)

和解决方案1类似:

00000000 T myFunction
00000200 t privateKey
Run Code Online (Sandbox Code Playgroud)

最安全的存储类在哪里放置密钥 - 或者在安全性方面没有区别?还有其他更安全的解决方案吗?

hiv*_*ert 6

无论你把它放在哪里,它都将作为一些常量数组存储在可执行文件中,如果你使用动态存储类(例如:local var),它将被复制.我认为使用任何一种技巧都不会改变密钥的安全性.

一般建议:如果你想重新发明一些加密轮.不要这样做.你可能会失败.许多着名的尝试都失败了(WIFI安全,DVD加密...)