C# 解决注册/验证问题的最佳方法

C# 解决注册/验证问题的最佳方法,c#,.net,vb.net,windows,visual-studio,C#,.net,Vb.net,Windows,Visual Studio,我编写了一个注册密钥脚本,当应用程序位于连接到internet的计算机上时,该脚本非常有效。但是,我希望在应用程序位于保持脱机状态的计算机上时使脚本正常工作。我希望你们能给我一些想法,让我知道如何让这个工作 脚本如何工作 用户安装应用程序 在打开的屏幕上,用户单击一个“指纹”按钮,生成一个计算机特有的代码(操作系统和硬件信息的组合) 用户提交指纹 我有一个应用程序在我的终端,我采取他的指纹,添加一个到期日期,它输出一个密钥文件,这是唯一的他的计算机,将使应用程序无用,直到密钥文件被更新 要检查过

我编写了一个注册密钥脚本,当应用程序位于连接到internet的计算机上时,该脚本非常有效。但是,我希望在应用程序位于保持脱机状态的计算机上时使脚本正常工作。我希望你们能给我一些想法,让我知道如何让这个工作

脚本如何工作

  • 用户安装应用程序
  • 在打开的屏幕上,用户单击一个“指纹”按钮,生成一个计算机特有的代码(操作系统和硬件信息的组合)
  • 用户提交指纹
  • 我有一个应用程序在我的终端,我采取他的指纹,添加一个到期日期,它输出一个密钥文件,这是唯一的他的计算机,将使应用程序无用,直到密钥文件被更新
  • 要检查过期日期,应用程序在每次加载应用程序时都会执行服务器检查
  • 因此,我面临的问题是,当计算机脱机时,它将使用系统时间检查过期日期。到目前为止,还没有什么能阻止人们让电脑离线,只是让系统时钟倒转

    除了强制用户在线加载应用程序之外,我似乎想不出一个合理的系统检查——除了服务器检查之外,这个应用程序不需要在线。我知道这很棘手,我被难住了


    任何帮助都会得到感激

    正如您所指出的,您不能信任客户提供准确的时间数据。如果无法访问受信任的时间源,则无法仅使用过期日期可靠地防止所描述的攻击

    您可以强制使用受信任的时间源(例如,使用内部RTC作为种子的USB PRNG加密狗)来验证系统时钟,然后阻止应用程序运行。然而,对于低容量,这种加密狗的价格通常为每台60美元以上

    一个简单的对策是记录应用程序已打开的时间,如果应用程序已打开太长时间而未签入,则终止。例如:如果您的预期入住频率为3个月,并且计算机显示您上次入住已有3天,但应用程序已打开45天,则可以确定时钟不正确


    即使如此,您的代码仍在客户端不受信任的计算机上运行,并且可能被破坏。DRM的任何衡量标准都只是模糊化。

    起初,用户总会找到打破离线授权机制的方法,而且通常会。所以在投入精力之前考虑一下。

    您需要更改您的许可机制。考虑到可能有用户已经在旧机制上使用您的应用程序,这要困难得多。如果只想使用新的授权机制,您可能必须保留这两种授权机制,或者向现有用户提供更新

    要实现脱机许可方案,可以使用类。请注意,这永远不会像您当前的方法那样有效。以下是我能想到的简单方法:

  • 当用户安装或首次加载应用程序时生成ID
  • 根据您选择的算法安装的日期对其进行加密。将其保存在注册表或XML文件中
  • 每次用户打开应用程序时,加密并保存上次使用的日期
  • 如果在任何时间点,当前日期小于上次使用的日期,请不要更新上次使用的日期。相反,告诉用户更新当前日期(确保注意时区和夏令时)

  • 如果您的用户很少使用您的应用程序,他们仍然可以使用它。

    我终于完成了它,我认为它看起来非常好:1。程序加载2。用户必须连接到internet才能创建计算机和时间4独有的指纹。用户将代码传递给我,然后我生成一个单独的代码来解锁计算机,直到过期日期5。每次应用程序加载和退出时,程序都会更新时间,以确保时间向前移动6。当应用程序发现它要更新时间7时,它也会连接到internet。任何时候,在网络验证时间之前,不同步计算机锁