在C ++中隐藏加密密钥的跨平台方式?

时间:2009-07-10 23:42:57

标签: c++ security cross-platform cryptography

我的应用程序需要使用一些硬编码的对称加密密钥(虽然我知道存储公钥是唯一完美的解决方案,但这是不可协商的)。我们希望密钥存储模糊,以便通过分析可执行文件无法识别它们,并在尽可能短的时间内在内存中“活动” - 以增加难度内存转储以明文形式检索它们。我对使用 C ++ 功能感兴趣(想到使用某种scoped_key)。该解决方案必须可移植 - Windows,Linux,MacOS - ,因此无法利用操作系统加密API。

您将如何设计这样的系统?非常感谢。

6 个答案:

答案 0 :(得分:4)

你所要做的就是通过默默无闻来保障安全。如果你让我们中的一个想出一个想法,你甚至都没有。

John Skeet has a good article on this too.

我可以说随意做一些事情。

答案 1 :(得分:3)

您的scoped_key可以只是堆栈中的KeyHolder对象。它的构造函数接受混淆的缓冲区并从中生成一个真正的密钥,它的析构函数将内存清零并释放内存。

至于如何在二进制文件中实际混淆密钥,你可能尝试的一个愚蠢的选择是放在一个更大的随机二进制块中并记住它的偏移量和大小,并且可能用一些短的随机序列对它进行异或。

如果你做了XORing的事情,你实际上可以避免在内存中使用真正的密钥。只需修改解密,从密钥中读取一个字节,然后再使用它,用适当的值对其进行异或。

*在此处添加免责声明*

答案 2 :(得分:3)

您是否考虑过这实际上是您计划中的弱点?让我们假设您正在进行许可证检查 - 尽管其他检查同样适用。无论您的密钥隐藏得多好,以及您的算法如何混淆,在某些时候您还必须执行以下操作:

if(!passesCheck()) {
  exit(1); 
}

您的潜在对手无需找到密钥,解密密钥,找出算法或其他任何内容。他们所要做的就是在代码中找到确定检查是否成功的位置,并将'jnz'指令替换为'jmp'以使测试无条件地通过。

答案 3 :(得分:2)

您应该查看防篡改软件,例如CloakwareArxan

TR并不便宜:)

答案 4 :(得分:0)

如果您没有利用您将运行的任何平台,则无法保证您可以在程序中有效隐藏对称加密密钥。您可以假设攻击者将拥有一个调试器,并最终将弄清楚如何在必须使用密钥解密的函数中设置断点。然后是游戏结束。

答案 5 :(得分:-2)

为什么不看隐写术,因为你可以隐藏图像中的键。可以找到密钥,但如果图像不遵循明显的图案(例如空间图像),则可能更难。这可以是跨平台的。