使用RSA实施许可证验证

时间:2009-09-28 18:43:57

标签: c# encryption licensing rsa encryption-asymmetric

我即将出售我用C#编写的程序,我想严格控制它的许可证。这意味着我想让客户端每次启动都连接到我的服务器。这也使我能够禁用密钥(如果在paypal上退款或代码分发)。当然,这可能是其他用户的麻烦,但在这种情况下是必要的。 由于我无法找到任何未破解的.NET许可系统,我想采取自己编写一个小方法的方法。 我的计划是做以下事情:

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

2 个答案:

答案 0 :(得分:3)

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

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

想要你的应用程序的人会找到你可以设想的任何类型的保护。你最好坚持一些简单的东西,拥有一个值得付费(并且很容易)的产品,并确保它值得你所要求的价格。


修改

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

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

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

基于Web的应用程序将出现与应用程序相同的问题(即,无论何时用户处于脱机状态,网络何时关闭,服务器何时关闭等,它都将关闭)。所以在这方面没有额外的风险。

答案 1 :(得分:0)

  

RSA是否正确?

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

PKE(公共密钥加密)的一个功能是,它允许各方之前从未交换过信息的对方交谈(例如,陌生人)。

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

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


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

任何想要你的软件足够严重的人都可以完全绕过身份验证。 RSA没有做任何事情来阻止这种情况。

真正的问题是:打破单个许可证会使所有许可证变得脆弱/毫无价值。在这两种情况下,(RSA和密钥),答案是否定的。仅仅因为该软件的一个副本遭到黑客攻击并且其密钥被暴露,或许可证系统被绕过,其他副本就不再暴露。在这方面,PKE和SSE似乎与我相同。

因为共享密钥更易于实现,并且计算执行速度更快,所以我认为在这种情况下优先于RSA / PKE。这并不是说RSA是“错误的”。它将完成你所追求的目标,达到与SSE相同的程度(不多也不少)。但我认为SSE是更明智的选择。