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

时间:2014-03-05 09:32:32

标签: 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
}

2。)Local Stackvariable

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

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

如果用户的计算机可以执行代码并访问数据,那么控制计算机的用户也可以。没有“只有程序可以看到的东西”这样的东西。

虽然有一些尝试制作“防篡改软件”,如TPM,但我认为这不会解决您的问题(这实际上需要用户合作并承诺在您执行时不要查看) 。您需要更改更高级别的政策以更改您的要求。

答案 2 :(得分:2)

其他答案都是正确的。您无法隐藏需要使用它的用户的密钥。

您可以做的最好的事情是将密钥放在物理上不同的计算机上,并使用网络(互联网/局域网)来传送密钥。当然,这会增加进一步的问题,因为您需要对用户进行身份验证,并确保传输密钥。

这是一个广泛的专业领域,称为Key Management

我在这里给出的答案中概述了一个解决方案:How to properly do private key management