Encryption 如何在代码中隐藏密钥?

Encryption 如何在代码中隐藏密钥?,encryption,obfuscation,Encryption,Obfuscation,一段时间以来,我一直在想一些软件是如何以一种无法被轻易发现的方式隐藏密钥的。仅举几个例子: DVD播放器软件隐藏CSS键 带有序列号/注册码的软件隐藏用于验证序列号的密钥/哈希 显然,这些程序所做的不仅仅是将密钥放在一个字节[]中,因为这样可以很容易地窃取它们的密钥并生成自己的序列号,等等 使用何种策略来隐藏这些密钥以使其不易被发现?这些密钥之所以如此容易被发现,是因为它们隐藏在软件中 不惜一切代价避免在软件中隐藏秘密——模糊处理只会让你走到这一步。扪心自问:我能在多大程度上隐藏软件中的一个

一段时间以来,我一直在想一些软件是如何以一种无法被轻易发现的方式隐藏密钥的。仅举几个例子:

  • DVD播放器软件隐藏CSS键
  • 带有序列号/注册码的软件隐藏用于验证序列号的密钥/哈希
显然,这些程序所做的不仅仅是将密钥放在一个字节[]中,因为这样可以很容易地窃取它们的密钥并生成自己的序列号,等等


使用何种策略来隐藏这些密钥以使其不易被发现?

这些密钥之所以如此容易被发现,是因为它们隐藏在软件中


不惜一切代价避免在软件中隐藏秘密——模糊处理只会让你走到这一步。扪心自问:我能在多大程度上隐藏软件中的一个密钥,不让那些完全可以访问反汇编、用户模式和内核模式调试器,并且没有日常工作的人知道?破解只是时间问题。

验证许可证并不总是需要密钥


但是忽略这一事实,您的密钥也可能是另一个函数的结果。实际上,您并没有存储特定的键值,而是有一个函数可以动态生成键(总是相同的结果)。虽然并非不可能,但由于您不再寻找值,因此查找起来要困难得多,但您必须找出它是一个等式。

在代码中隐藏密钥并不是真正安全的。正如你可能已经注意到的那样,DVD和大多数软件序列号注册每天都会遭到黑客攻击。如果你真的想保护某些东西,你需要使用公钥加密。

当我们开始开发我们的软件时,我们创建了一个过期的许可证文件。然后,我们意识到,没有太多人对购买我们的软件感兴趣。然后,我们决定免费赠送。更多的人开始关心我们的杰作。最后,我们开放了我们的软件。更多的用户开始使用它。现在,我们只希望这些用户中的一小部分可能成为付费客户(即购买产品支持或要求定制)


底线是,如果有人想破解你的软件,他/她无论如何都会这么做。你真的值得浪费时间用这个隐藏的秘密钥匙来保护它吗

你不能永远隐藏钥匙。但你肯定很难找到。有些方法是在内存中加密密钥,保留相互检查的多个副本(可能加密方式不同),保留可访问的虚拟副本,以某种奇怪的格式存储密钥,等等。如果有人真的想要您的密钥,这些方法都不起作用,但你至少可以劝阻一个不经意的/没有经验的攻击者。

我认为这是DVD和BluRay这么快被破解的最大原因之一。我认为,他们能够真正阻止普通人以数字方式复制家庭电影的唯一方法是,如果他们创建了一种未经许可在计算机上使用的媒体,并且只能在经过认证的播放器上使用。这将切断希望在电脑和笔记本电脑上观看电影的市场份额,但可能会在更长一段时间内停止完美的数字拍摄,并阻止普通人这样做。

底线是,你不能。有关原因,请参见此处的任何其他评论。甚至像PGP/GPG这样的加密软件也会将密钥存储在文件中,然后强烈要求将这些文件保存在闪存驱动器上的保险箱或其他安全的地方。将发现作为可执行代码一部分存储的密钥

事实上,如果您试图在客户端计算机上加密任何将由客户端作为正常操作的一部分解密的内容,那么这也是一件愚蠢的差事。客户机本身是不安全的,您无法控制它们将对您的数据执行什么操作

相反,如果您试图进行身份验证,请查看基于Internet的身份验证,并登录到服务器,或者查看用于验证软件的某种生成的密钥码

作为公私密钥对的一部分的密钥应保存在可以保护的数据文件中。对称密钥应作为会话密钥动态生成,然后丢弃。始终假设任何人在他们的计算机上有一个秘密或会话密钥都能够发现它,并在违背您意图的情况下使用它


阅读Bruce Schneier的“”了解更多信息。

您只需将密钥隐藏在某个地方,并在需要时解密即可。“安全地”使用钥匙是一个复杂的部分。破解程序可能会在使用解密密钥的位置设置断点并将其转储。他们可能会扫描您的代码,寻找显示您正在使用已知加密算法的模式(大多数算法都有预先计算的表)。等等

这就是为什么您需要使整个软件的可执行性难以分析的原因。为此,您可以使用可执行打包程序、在虚拟机中运行代码、完整性检查等。所有这些都会降低调试和修改代码的速度

正如大多数人指出的那样,你不能阻止任何人,只是让他们慢下来。我会去一个cracker论坛,征求关于关键隐藏问题的建议。如果你问得好的话,他们很可能会很有帮助


注:公钥加密不会更好地隐藏密钥,但如果您正在执行授权方案,它可能会使密钥生成器更难(或理论上不可能)生成。

如果您负担得起,最好将私钥存储在加密USB令牌中。关键是只能写。令牌在其硬件内部执行加密操作。检索密钥变得非常复杂(如果令牌没有已知的漏洞,而旧的令牌则没有这种漏洞)。

您不能,这是不可能的。任何有权访问目标计算机的攻击者都可以将您的代码反汇编为