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

TTa*_*Tar 45 encryption obfuscation

我有一段时间想知道一些软件如何隐藏秘密密钥,以至于无法轻易发现它们.举几个例子:

  • DVD播放器软件隐藏了CSS密钥
  • 带序列号/注册码的软件隐藏用于验证序列号的密钥/哈希值

显然,这些程序不仅仅是在字节[]中使用密钥,因为这样可以轻松窃取密钥并生成自己的序列号等.

使用了哪些策略来隐藏这些键,以便无法轻易找到它们?

Mic*_*ael 37

这些秘密密钥如此容易被发现的原因是因为它们隐藏在软件中.

避免不惜一切代价隐藏软件中的秘密 - 混淆只会让你到目前为止.问问自己:如何能够从完全访问反汇编,用户模式和内核模式调试器以及没有日常工作的人那里隐藏软件中的密钥?它破裂只是时间问题.

  • 这回答了这个问题吗? (34认同)
  • 正如你所说,“它被破解只是时间问题”。因此,考虑到此密钥将比硬件保护的密钥更早到期,这就是为什么此策略可能可行的原因。 (2认同)

Joh*_*ith 13

您只需在某处隐藏密钥,并在需要时对其进行解密.使用"安全"键是复杂的部分.破解者可能会在您使用解密密钥的位置设置断点并将其转储.他们可能会扫描您的代码中的模式,这些模式表明您使用的是已知的加密算法(大多数算法都有预先计算的表格).等等

这就是为什么你需要使整个软件可执行难以分析.为此,您使用可执行的打包程序,在虚拟机中运行代码,完整性检查等.所有这些都是为了减慢调试和修改代码.

正如大多数人在这里指出的那样,你无法阻止任何人,只是放慢速度.我会去一个饼干论坛,并询问有关密钥隐藏问题的建议.如果你问得很好,他们很可能会有所帮助.

PS.公钥加密不会更好地隐藏密钥,但如果你正在进行许可方案,它可能会使密钥生成器变得更难(或理论上不可能).


Fur*_*der 6

底线是,你不能.请参阅此处的任何其他评论,原因如下.甚至像PGP/GPG这样的加密软件也会将密钥存储在一个文件中,然后大力敦促将这些文件保存在安全的闪存驱动器上,或其他安全的东西上.将发现作为可执行代码的一部分存储的密钥.

实际上,如果您尝试加密客户端计算机上的任何内容,这些内容将由客户端作为正常操作的一部分进行解密,那么这也是一个愚蠢的错误.客户端计算机本质上是不安全的,您无法控制他们能够对您的数据执行的操作.

如果您正在尝试进行身份验证,请查看基于Internet的身份验证,并登录服务器,或者使用某种生成的用于验证软件的KeyCode.

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

阅读Bruce Schneier的" Applied Cryptography "以获取更多信息.


Pro*_*mit 5

你不能永远隐藏一把钥匙.但你可以肯定很难找到.一些方法是加密内存中的密钥,保留多个副本(可能是加密方式不同),彼此相互检查,留下虚拟副本进行访问,以一些奇怪的格式存储密钥等等.如果真的有人,它们都不会起作用想要你的钥匙,但你至少可以劝阻一个随意/缺乏经验的攻击者.