C# 为只能使用一次的软件创建唯一密钥

C# 为只能使用一次的软件创建唯一密钥,c#,winforms,C#,Winforms,Im已经创建了一个基于windows的软件应用程序。很快我就会让它活下来。这意味着我的客户从我的网站下载后可以使用它。还需要提到的是,我制作的软件只能使用我提供的密钥工作。一开始是免费试用 在这里我生成35位的密钥,这是唯一的一个。意味着一旦用户向我请求密钥,我向他/她发送密钥,他/她就可以使用我的应用程序。但真正的问题来自这里 我希望代码只使用一次 例:如果用户下载了我的应用程序,他可以使用该密钥来使用我的应用程序,但同一密钥不能被其他任何人使用。假设我的密钥是xxx,相同的代码xxx不适用于

Im已经创建了一个基于windows的软件应用程序。很快我就会让它活下来。这意味着我的客户从我的网站下载后可以使用它。还需要提到的是,我制作的软件只能使用我提供的密钥工作。一开始是免费试用

在这里我生成35位的密钥,这是唯一的一个。意味着一旦用户向我请求密钥,我向他/她发送密钥,他/她就可以使用我的应用程序。但真正的问题来自这里

我希望代码只使用一次

例:如果用户下载了我的应用程序,他可以使用该密钥来使用我的应用程序,但同一密钥不能被其他任何人使用。假设我的密钥是xxx,相同的代码xxx不适用于下载我的应用程序的任何其他人。只是为了让软件只供真正的用户使用

我也浏览了这个链接

丹尼·斯塔顿

我还没有达到我的要求

首先,我想获得注册下载我的应用程序的人的Ip地址,基于此,我可以限制我的密钥仅由Ip地址存储在我的数据库中的人使用。但我认为这是一个错误/不必要的过程。要使用我的应用程序,每次都应该插入个人网络电缆。但这不能解决我的目的

其次,我考虑创建一个应用程序ping到我的服务器或我的进程

与最初用户运行应用程序(在线或离线)时一样,应用程序应该可以工作,但一旦用户将网络电缆/插头连接到网络,就会向我的服务器或我发出警报。在我这边,我可以检查用户是否使用了我提供给他的钥匙。如果用户不是正版的,我应该能够阻止他再使用我的应用程序。从我的角度来看,我决定将密钥存储在我提供的数据库中。和每个请求的键在另一个表中。我不确定我是不是走对了。但到目前为止,这是我脑海中浮现的事情

但总而言之,最后我希望一个密钥只能由一个用户使用。只是为了避免一百万不同的用户用一个键使用我的应用程序

我不确定我提供的任何想法


现在有什么方法可以实现吗?

获取他的机器的硬件指纹,并基于此生成密钥。软件应检查是否为该特定机器生成了密钥。 但是,这需要在线激活您的软件。你可以用两种方法来做

  • 允许用户启动未激活的应用程序并显示他发送给您的硬件指纹。然后返回他输入的激活密钥
  • 您的应用程序将自动连接到激活服务,并发送指纹、接收激活密钥并将其存储
另一点是包含关于硬件的几个组件的信息,并允许用户更改一个或几个组件。例如,获取HDD序列号、MAC地址、主板序列号、一些CPU信息(如姓氏)的指纹,您应该允许用户升级或添加其他HDD


有这么多的话题。

我认为你必须做出选择,你的钥匙系统越强大,对你的用户来说就越困难

IE:一个好的系统应该是生成一个硬件密钥,所以它只能安装在注册的计算机上。虽然它工作得很好,但购买新计算机的用户可能会遇到麻烦,要求您注册一个新的硬件密钥

如果你只给他们一个密钥(比如序列号),那么在另一台计算机上使用它可能会很容易

所以基本上,如果你不认为很多用户会因为软件不会被很多人使用而放弃他们的密钥,我就不会得到“超强”的硬件认证


另外,不要注册IP地址,每个拥有动态IP的人都会因为你这样做而讨厌你。

为什么不使用guid?它是不确定的,不会产生与第二次相同的结果。每个用户生成的Guid始终是唯一的。存储IP对此没有意义,因为每次用户登录网络时可能会有所不同,具体取决于提供商。即使公司有固定的IP,您也无法区分来自同一公司的多个用户。@Mutu Yolbulan:我只想做一些事情,防止许多人使用单个密钥访问我的应用程序。我不知道怎么做。我已经创建了一个生成唯一代码的不同应用程序,因此创建唯一密钥不是我的问题。我所想的是同一把钥匙不应该用一次以上。例如:如果密钥是“xxx”,并且用户已经下载了我的应用程序,那么他只能使用该密钥使用我的应用程序。其他任何人都不应使用同一密钥“xxx”。希望你能理解我的疑问。我试着说得具体一点。你是想使用该指令使机器无法再次执行你的程序,还是想阻止用户再次运行它?或用于在可执行文件关闭后立即将其标记为删除?一个有足够动机的用户可以攻击你所做的任何事情,以防止重用或重新安装。