你如何隐藏代码中的密钥?

一段时间以来,我一直在想,一些软件如何隐藏秘密密钥,使得它们不能被轻易发现。 只是几个例子:

  • DVD播放器软件隐藏CSS密钥
  • 带有序列号/注册码的软件隐藏用于validation序列号的密钥/散列

很明显,这些程序不仅仅是在一个字节[]中做了一些事情,因为这样可以很容易地窃取他们的密钥并生成自己的序列号等等。

用什么样的策略来隐藏这些密钥,使它们不易被发现?

这些密钥很容易被发现的原因是因为它们被隐藏在软件中。

不惜一切代价避免在软件中隐藏秘密 – 混淆只会让你到目前为止。 问问你自己:我可以如何从一个完全访问反汇编,用户模式和内核模式debugging器的软件中隐藏一个密钥? 破解之前只是一个时间问题。

您只需将密钥隐藏起来,并在需要时将其解密。 使用钥匙“安全”是复杂的部分。 cookies可能会为您使用解密密钥的地方设置一个断点并将其转储。 他们可能会扫描您的代码的模式,这表明您正在使用已知的encryptionalgorithm(大多数algorithm都有预先计算的表格)。 等等

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

这里的大多数人都指出,你不能阻止任何人,只要放慢脚步。 我会去一个黑客论坛,并询问有关隐藏问题的build议。 如果你问得好,他们很有可能是有用的。

PS。 公钥密码不会更好地隐藏密钥,但如果您正在执行授权计划,则可能会使密钥生成器变得更难(或理论上不可能)。

底线是,你不能。 在这里看到任何其他评论为什么。 即使像PGP / GPG这样的encryption软件将密钥存储在一个文件中,然后强烈地敦促这些文件保存在闪存驱动器中的安全或其他安全的东西。 存储为可执行代码一部分的密钥将被发现。

事实上,如果你试图在客户端机器上encryption任何东西,而这些东西是客户端解密的,那么这也是一个愚蠢的行为。 客户端机器本质上是不安全的,你无法控制他们将能够做的数据。

如果您正在尝试进行身份validation,请查看基于Internet的身份validation并login到服务器,或者使用某种生成的KeyCode来validation软件。

作为公私密钥对的一部分的密钥应保存在可以保护的数据文件中。 对称密钥应当随时生成为会话密钥,然后丢弃。 始终假定任何在计算机上拥有密钥或会话密钥的人都能够发现它,并将其用于违反您的意图。

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

你永远不能隐藏一个密钥。 但是你可以确定很难find。 有些方法是对内存中的密钥进行encryption,保留相互检查的多个副本(可能是encryption方式不同),不允许访问虚拟副本,以一些奇怪的格式存储密钥等。如果真的有人真的想要你的钥匙,但是你至less可以劝阻一个随便/没有经验的攻击者。

当我们开始开发我们的软件时,我们创build了一个过时的许可证文件。 然后,我们意识到,没有太多的人甚至有兴趣购买我们的软件。 然后,我们决定免费赠送它。 许多人开始关心至less试图我们的杰作。 最后,我们已经开源了我们的软件。 许多用户开始使用它。 现在我们只希望less数这些用户可能变成付费用户(即购买产品支持或要求定制)。

底线是,如果有人想破解你的软件,他/她会做到这一点。 浪费你的时间真的值得用这个隐藏的密钥来保护它吗?

您并不总是需要密钥才能validation许可证。

但是忽略这个事实,你的钥匙也可能是另一个function的结果。 你实际上并没有存储一个特定的键值,而是你有一个dynamic生成键的函数(总是相同的结果)。 虽然不是不可能,但是由于你不再寻找价值,所以很难find它,但是你必须弄清楚它是一个等式。

如果您能负担得起,最好的方法是将私钥存储在encryption的USB令牌中。 关键是只写,即你可以设置它,但不能读取它。 令牌在其硬件内部执行encryption操作。 检索密钥变得非常复杂(如果令牌没有已知的漏洞,这与旧版本不一样)。

隐藏代码中的秘密密钥并不会很安​​全。 正如您可能已经注意到DVD和大多数软件序列号注册每天被黑客入侵。 如果你真的想保证某些东西你需要使用公钥encryption。

我认为这是DVD和BluRay如此迅速破解的最大原因之一。 我认为他们能够真正阻止一般人能够数字复制家庭电影的唯一方法就是他们创造了一种没有被许可在电脑上使用的媒体,而且只能用在经过authentication的播放器上。 会削减那些想要在电脑和笔记本电脑上观看电影的市场,但是可能会停止一段时间的完美的数字撕裂,并会阻止一般人能够做到这一点。