Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在哪里可以存储(和管理)应用程序许可证信息?_C#_.net - Fatal编程技术网

C# 在哪里可以存储(和管理)应用程序许可证信息?

C# 在哪里可以存储(和管理)应用程序许可证信息?,c#,.net,C#,.net,我正在开发一个Windows应用程序。这需要用户注册才能使用它。。。 现在,我将许可证信息作为文件存储在APpData中。但删除该文件会重置试用版日期。所以,我现在计划将其保存在注册表中。 但是,大多数用户在Windows中没有访问注册表的管理权限(有限用户)。 我能做什么?我在哪里可以保存序列号和日期?不幸的是,无论您在客户的机器上存储许可证信息,它都可能被滥用(因为这是他们的机器!) 做到这一点的唯一安全方法是让您的程序通过远程服务签入,显然这需要大量开销 我自己的方法是,如果客户弄乱了他们

我正在开发一个Windows应用程序。这需要用户注册才能使用它。。。 现在,我将许可证信息作为文件存储在APpData中。但删除该文件会重置试用版日期。所以,我现在计划将其保存在注册表中。 但是,大多数用户在Windows中没有访问注册表的管理权限(有限用户)。
我能做什么?我在哪里可以保存序列号和日期?

不幸的是,无论您在客户的机器上存储许可证信息,它都可能被滥用(因为这是他们的机器!)

做到这一点的唯一安全方法是让您的程序通过远程服务签入,显然这需要大量开销

我自己的方法是,如果客户弄乱了他们的许可证密钥,那么他们应该预料到问题,而您没有义务提供帮助。我会确保你的密钥包含关于它运行的机器的信息(以防止简单地复制密钥),但是要保持它非常简单

当我自己研究许可证时,我发现了一个我倾向于坚持的理念——你用复杂而困难的许可证设置赶走了更多的潜在客户,而不是因为盗版而失去的客户


我的建议是,你应该改变你的逻辑——与其允许移除许可证密钥来重新启动免费试用,为什么不强迫他们拥有许可证密钥来解锁完整的应用程序?

在我看来,关键是你必须改变你管理许可证的方式。我写了一个项目()来演示这里描述的一些技术

哪里 如果他们删除了许可证数据文件,然后重新开始试用?若文件不存在,不要启动应用程序,并在第一次安装时使用安装操作创建它

现在您面临第二个问题:如果他们卸载并重新安装应用程序会怎么样?第二步是将此文件移动到应用程序数据文件夹(例如)。这只是稍微安全一点(因为卸载时不会删除应用程序数据),但他们仍然可以手动查找和删除它。若应用程序将由低权限用户安装,那个么您就无能为力(您不能尝试将许可证隐藏在注册表中的某个位置)

现在是你和饼干之间的游戏。他们会赢的,永远。你只会让合法用户的生活变得更加艰难,所以读一读grano salis。您可以在其中存储许可证数据:

  • 注册表。赞成:很容易做到。缺点:容易破解,对于低权限用户,每次只对一个用户有效。如果注册表项的名称中包含
    \0
    ,则注册表项(在每个用户库中)可能会以某种方式隐藏。看看尼斯邮报
  • 文件。优点:操作简单,而且比注册更安全。缺点:容易破解(但你可以隐藏更多,见下文)
  • 应用程序本身(将数据添加到可执行文件中,关于这一点,我们只需说几句话)。赞成:更难发现。缺点:杀毒软件可能会将其视为……病毒和应用程序更新也可能会删除许可证(当然,如果您没有正确处理这种情况),因此这会使您的代码和部署更加复杂
如何在文件中隐藏许可证?
如果你要用一个文件(它的位置不重要),你可以考虑让饼干的寿命(一点点)更难。我现在想到了两个解决方案:

  • 。该文件已附加到另一个文件,他们只需在Windows资源管理器中进行搜索就看不到该文件。当然,有一些实用程序可以管理它们,但至少它们必须明确地搜索它

  • 将其隐藏在应用程序数据中(例如,使用位图)。他们只是不知道这是许可证数据,还有什么更安全?问题是他们可以很容易地反编译您的C#程序以查看您的操作(请参阅关于代码模糊处理的段落)

可能还有很多人(这里的幻想是我们的主人),但别忘了…饼干会找到它(如果他们真的想要的话),所以你必须平衡你的努力

怎么 保持您的许可证架构,您现在处于死路一条。您必须做出的决定是,如果他们使用试用时间超过允许时间的风险高于他们因为无聊的保护而停止使用您的应用程序的风险

验证
如果您可以假设他们有网络连接,那么您可以使用某种唯一的ID(即使是关于Windows 8,您也可以查看一下)在线验证许可证(仅在他们第一次运行您的应用程序时)。服务器端验证可能非常棘手(如果您希望以正确的方式进行验证),在本文中,我们将以一个程序流的示例来说明如何以正确的方式管理服务器端验证

数据混淆/加密
您的许可证文件/数据现在处于安全位置。几乎没有人会找到它。现在需要另一个步骤:模糊处理。如果他们找到您的文件后,您的许可证数据是纯文本的,那么更改它太容易了。您有一些选项(按增加的安全性和复杂性排序):

  • 混淆你的文件。如果他们不能用简单的文本编辑器(甚至十六进制编辑器)理解文件中的内容,那么他们需要更多的时间和精力来破解它。例如,你可以压缩它们:参见这篇关于的文章。请注意,简单的base64编码也会混淆文本文件
  • 用对称算法加密它们。即使是一个非常简单的方法也可以很好地工作,在这里,您只是试图隐藏数据。有关示例,请参见。我看不出有什么理由喜欢这种方法而不喜欢更简单的模糊处理
  • 使用非对称算法对其进行加密。这是复杂性和安全性方面的一大步,只有当许可证令牌由服务器/外部实体提供时,它才会(非常)有用。在这种情况下,它将混淆使用其私钥签署的许可证。客户端应用程序将使用其公钥验证签名,即使cracker会找到此文件(并反编译您的代码以读取公钥),它也会
    RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\YourAppPath", true);