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

4
我的应用程序需要使用一些硬编码的对称加密密钥(尽管我知道存储公钥是唯一完美的解决方案,但这是不可协商的)。我们希望这些密钥被存储为模糊的形式,以便它们不会被分析可执行文件时识别,并且在内存中“活动”的时间尽可能短 - 以增加从内存转储中以明文检索它们的难度。我有兴趣使用C++功能(使用某种scoped_key似乎很合适)。解决方案必须是可移植的 - Windows、Linux、MacOS - 因此不能利用操作系统的加密API。
您将如何设计这样一个系统?非常感谢。

这实际上是不可能做到的。你在尝试解决什么问题?也许有另一种方法可以完成它。 - Jesse Weigert
如果您能解释为什么非对称加密不是一个选项,那将非常有用。 - ykaganovich
也许如果您解释一下想要实现什么,而不仅仅是讨论如何实现它,会更有帮助。由于您声称存储公钥将是一个完美的解决方案,这意味着您要么想编写只能加密(但不能解密)的软件,要么想编写需要验证某些内容的软件。没有更多细节,很难做出任何有用的评论。 - Accipitridae
感谢所有的回答。非对称加密不是一个选项,因为我正在构建的系统需要与使用对称加密的旧系统兼容。也就是说,两者必须在给定相同输入的情况下生成相同的输出 - 这比较复杂,但这是一般的想法。@Accipitridae,是的,只需要加密。选择对称加密并不是一个好选择,但我没有改变它的立场。 - Pedro d'Aquino
6个回答

4

3

在IT技术中,scoped_key可以简单地是栈上的一个KeyHolder对象。它的构造函数接受混淆的缓冲区并将其转换为真正的密钥,而它的析构函数则清零内存并释放内存。

至于如何在二进制中实际混淆密钥,你可以尝试一种愚蠢的选择,即将其放在一个更大的随机二进制块中,并记住其偏移量和大小,可能使用某些短随机序列进行XOR运算。

如果您这样做了XOR操作,实际上可以避免在内存中拥有真正的密钥。只需修改解密过程以从密钥读取一个字节,并在使用之前将其与适当的值进行XOR运算即可。

*在此加入关于安全通过混淆是多么愚蠢的免责声明*


1
感谢您放弃免责声明 - 我知道这一点,但这比没有保护要好!重要的是要记住这只是一种缓解措施,任何有技能和决心的攻击者都会绕过它。 - Pedro d'Aquino

3

您是否考虑过这实际上是您程序的弱点?假设您正在进行许可证检查 - 虽然其他检查同样适用。无论您的密钥隐藏得多么好,算法混淆得有多么好,在某个时刻,您必须执行类似于以下内容的操作:

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

你的潜在对手不需要找到密钥、解密它、弄清算法或其他任何事情。他们只需要找到代码中确定检查是否成功的位置,并将“jnz”指令替换为“jmp”,以使测试无条件通过。


谢谢,尼克。我面临的问题不是许可证检查或任何其他检查。这是一个软件,它生成一些数据,对其进行加密并将其发送回服务器。 - Pedro d'Aquino
这里的目标是什么?如果你想防止用户读取数据,这就没什么意义了,因为他们可以在加密之前检查数据。如果你想防止他们修改数据或生成自己的消息,你需要知道仅靠加密并不能保证完整性 - 你需要使用公钥密码或HMAC来实现。 - Nick Johnson

2

您应该考虑使用防篡改软件,例如CloakwareArxan

防篡改软件并不便宜 :)


0

如果您不利用您将要运行的任何平台,就无法保证您可以有效地隐藏对称加密密钥在您的程序中。您可以假设攻击者将拥有调试器,并最终找出如何在必须使用该密钥进行解密的函数中设置断点。然后游戏结束。


-2
为什么不考虑使用隐写术,因为您可以将密钥隐藏在图像中。虽然可能会找到密钥,但如果图像没有遵循明显的模式(例如太空图像),那么它可能会更难。这可以跨平台实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接