我的应用程序需要使用两个硬编码的对称密码密钥(虽然我知道存储公钥是唯一完美的解决方案,但这是不可协商的)。我们希望将密钥存储在混淆的中,这样就不会通过分析可执行文件来识别它们,并且尽可能少地在内存中“活动”,从而增加内存转储以明文形式检索它们的难度。我对使用C++特性感兴趣(想到了使用某种scoped_key
)。解决方案必须是便携- Windows、Linux、MacOS -,因此不能利用操作系统加密API。
你将如何设计这样一个系统?非常感谢。
发布于 2009-07-10 23:57:25
您的scoped_key
可以只是堆栈上的KeyHolder
对象。它的构造函数获取模糊缓冲区并使其成为真正的密钥,而析构函数则将内存归零并释放内存。
至于如何真正混淆二进制中的键,您可能会尝试的一个愚蠢的选择是将其放入一个大得多的随机二进制块中,并记住它的偏移量和大小,并可能使用一些短的随机序列对其进行异或。
如果您执行XORing操作,实际上可以避免内存中有真正的密钥。只需修改解密,从密钥中读取一个字节,并在使用它之前,用适当的值对其进行XOR。
*
在这里添加免责声明,说明*
是多么愚蠢的通过默默无闻的安全性。
发布于 2009-07-10 23:47:03
你在这里所追求的只是通过默默无闻的安全。如果你有我们中的一个人想出一个主意,你甚至都不会有这个想法。
约翰·斯基特对此也有一篇很好的文章。
我只能说随便做点什么。
发布于 2009-07-11 10:36:15
你考虑过这是否是你计划中的弱点吗?为了论证起见,让我们假设您正在进行许可证检查--尽管其他检查也同样适用。无论你的密钥隐藏得有多好,你的算法有多模糊,在某种程度上,你都必须这样做:
if(!passesCheck()) {
exit(1);
}
你的潜在对手不需要找到密钥,解密它,找出算法,或者其他任何东西。他们所要做的就是在代码中找到您确定检查是否成功的位置,并将'jnz‘指令替换为'jmp’,以无条件地通过测试。
https://stackoverflow.com/questions/1112456
复制相似问题