6

有一些关于 IP 安全等的及时帖子,但我找不到专门针对算法的帖子。在我目前的一个项目中,我们决定采用离线注册密钥系统的路线。

我想我们最终的大多数用户群都会是诚实的,所以我认为我们不必担心太多。另一方面,我宁愿在没有大量汗水和眼泪的情况下让休闲饼干获得访问权。

那么,如何生成(和验证)密钥有哪些选择?由于安装模型是从内部网服务器上的 samba 共享运行,因此很可能无法使用硬件键控。另外,钥匙应该多长?

其次,验证算法简单地被反射出来的危险有多大,即使被混淆了?用非托管代码编写算法会更好吗?

4

5 回答 5

10

在我看来,您将面临的关键问题不在于您的注册算法和混淆程度(或缺乏)。

相反,它是这样的:在您的代码中的某个时刻,它归结为简单的二进制决策 - 运行或退出。破解你的系统只需要找到并调整这个决策点。

其他一切——混淆、强签名、篡改检测——都是为了让这变得更加困难,但它不能让它变得更难。

于 2009-01-18T02:42:33.183 回答
2

通常,您想要做的是选择一些您想要包含在密钥中的数据,例如谁拥有它以及它何时到期,甚至可能是您的应用程序需要正常工作的一些小代码(因此很难让它在没有钥匙)。然后使用 RSA 等数字签名方案,使用您公司的私钥对密钥进行数字签名。将公钥与应用程序可执行文件一起分发。然后在加载密钥时,只需验证签名是否有效,然后使用密钥中包含的数据即可。1024 或 2048 位的密钥应该足够了。

当然,无论您的代码多么复杂,总有人能够破解它或绕过它。所以你必须问自己的问题是你想让它有多难(记住更难的方案对你来说更难编码和维护)?有一个收益递减点,通常是相当低的。只要程序在没有密钥的情况下无法运行,并且密钥足够复杂以至于您无法使用十六进制编辑器伪造一个(或更改到期日期等),那么您可能没问题。

于 2009-01-17T20:33:07.890 回答
1

就重构密钥而言,如果他们将调用站点从托管变为非托管,那么将其写入非托管可能无济于事。如果您使用 Dotfuscator 专业人士,您可以选择一种混淆方式来启用他们的“篡改检测”,本质上他们会标记您的程序集,并且如果有人修改您可以让您的代码执行各种操作。当然,黑客可以删除它,但它需要更多的汗水和泪水。

于 2009-01-17T21:33:20.343 回答
1

我只找到了一种很好地锁定代码的方法。几乎所有形式的串行验证都可以被普通的二年级程序员轻松破解。

我这样做的方法是在 .NET 中使用 License 对象。在我自己开发的许可证对象中,它读取“许可证”文件以找出“家”在哪里。该许可证是一个加密字符串。字符串的私钥在 License 对象中。

然后,许可证对象使用同样加密的秘密密码调用 home。服务器解密密码并验证它......还记录IP和用户名以防欺诈调查。如果服务器可以验证密码,它会以秘密响应进行响应,再次加密以防止被欺骗。如果无法验证,则断开连接。没有响应发送,因此另一端的 License 对象失败。

当集成的 License 对象失败时,它会自动抛出异常,强制应用程序失败并在调用 license 时退出。

我花了大约两个工作日来编写服务器和许可证对象,所以这有点像锻炼,但不是火箭科学。

如果您想要一些示例源或更多信息,请告诉我。我会很高兴为您提供我所能提供的。

于 2009-01-18T03:03:42.547 回答
0

你可能想看看这个问题的答案

于 2009-01-17T20:20:58.443 回答