1

我即将出售我用 C# 编写的程序,并且我想严格控制它的许可证。这意味着我想让客户端每次启动时都连接到我的服务器。这也使我能够禁用密钥(在贝宝退款或代码分发的情况下)。当然这对其他用户来说可能是个麻烦,但在这种情况下是必要的。由于我找不到任何未破解的好的 .NET Licensing 系统,我想自己编写一个小系统。我的计划是执行以下操作:

  1. 生成一个包含 1024 个字符的 key.dat,随软件一起提供(每个用户都有)
  2. 在应用程序入口点向我的服务器添加一个 httprequest,它发送 key.dat + 当前时间戳,加密。
  3. 我的 HTTP 服务器(运行 PHP)解密请求并检查密钥是否有效(在我的数据库中)并回复“访问级别”(许可证类型)。如果密钥无效或被禁用,它会回复错误代码。就像请求一样,回复是用时间戳加盐的,因此某人无法通过向自己发送有效数据包来验证他的程序。正在客户端中检查时间戳。回复使用 RSA 和先前生成的公钥加密。
  4. 客户端收到响应,用私钥解密并做出反应。

RSA 是否是正确的方法,所以我可以确保数据包是由我发送的,而不是由我制作的(没有其他人拥有公钥)?有没有更好的方法来解决这个问题?

4

2 回答 2

3

想要你的软件足够糟糕的人只会反编译它并删除启动时打电话回家的代码部分。

如果您要向应用程序添加校验和以检查代码是否已被更改,则有人可以更改程序检查的校验和(或完全删除检查)。

足够想要您的应用程序的人会找到绕过您可以想到的任何类型保护的方法。你最好坚持做一些简单的事情,拥有一个值得(而且很容易)支付的产品,并确保它物有所值。


编辑

鉴于保护很重要,用户将在他们的机器上运行代码这一事实是您可以避免的风险。如果用户没有密码,他们就无法破解它。他们不能复制和分享它。

现在,它可能不适用于您打算编写的应用程序,但您应该考虑编写 Web、Flash 或 Silverlight 应用程序,而不是常规客户端应用程序。这样您就不必将代码分发给客户。您所要做的就是管理应用程序中的凭据,这应该比您的迂回 RSA 系统容易得多。

以集中模式推出软件的新版本也更容易,您根本不必担心被盗。当然,负载将成为以前没有的问题。并非所有应用程序都可以轻松(或根本)集中。我只是提出这个建议以确保您考虑它,因为它是您问题的有效解决方案。

基于 Web 的应用程序会遇到与您的应用程序相同的问题(即,只要用户离线、网络关闭、服务器关闭等,它就会关闭)。所以在这方面没有额外的风险。

于 2009-09-28T19:04:50.213 回答
0

RSA 是正确的方法吗?

我不认为 RSA 是您的最佳选择。

PKE(公钥加密)的功能之一是它可以让以前从未交换过信息的各方(例如陌生人)相互交谈。

我认为这不适用于您的情况。您的软件非常了解您的服务器。他们不是“陌生人”。

改为考虑共享密钥加密,您分发的每个软件副本都被赋予一个唯一的密钥,并且您的服务器也知道每个用户的密钥。密钥永远不会发送,必须受到保护,但仍可用于加密、签名和验证通信。


编辑在考虑评论和其他答案之后。

任何非常想要您的软件的人都可以完全绕过身份验证。RSA 没有采取任何措施来防止这种情况发生。

真正的问题是:破坏单个许可证是否会使所有许可证易受攻击/毫无价值。在这两种情况下,(RSA 和密钥),答案是否定的。仅仅因为软件的一个副本被黑客入侵并暴露了它的密钥,或者绕过了许可证系统,其他副本就不会再暴露了。PKE 和 SSE 在这方面对我来说似乎是平等的。

因为共享密钥更容易实现,并且计算速度更快,所以我认为在这种情况下它比 RSA/PKE 更受欢迎。这并不是说 RSA 是“错误的”。它将完成您所追求的,与 SSE 相同的程度(不多也不少)。但我认为 SSE 是更明智的选择。

于 2009-09-28T18:51:40.160 回答