在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件。今天就通过一篇简单的文章来预览一下其强大的功能。虽然我人为其已经基本满足了一个软件序列号的所有要素,但至于大家用不用得上,还得看大家的需求。总的来说,其源码并不复杂的,即使要增加功能,也可以使用其进行扩展。何苦,就我而言,虽然以前也做过简单的序列号注册和验证,但看完这个之后,自己真的是太天真了。以前也简直是弱爆了,所以某种意义上,这个组件的功能是很强大的。

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

本文原文地址:.NET平台开源项目速览(9)SoftwareProtector软件序列号生成组件介绍与使用

1.基本功能介绍

  说简单的,这个东西就是序列号生成器,用来保护应用程序的授权的。可以生成和验证不同类型的序列号(20位),能限制时间(最多999天),还能够锁定特定机器的key。这个组件是GUI界面,内核使用的是SKGL(Serial Key Generating Library)组件。所以使用的时候还是一起吧,地址如下:

官方网站:http://softwareprotector.codeplex.com/

http://skgl.codeplex.com/

看看界面所演示的功能截图:

如果选择了锁定机器,就只能在指定机器码上的电脑用了,下面是验证序列号的截图:

下面来简单看看核心的SKGL源代码以及使用情况。

2.核心的SKGL源码分析

SKGL源码的分析,由于总共代码量很少,实际的代码量只有260行,所以我对这个源代码进行了简单的翻译,特别是主要核心方法的功能,便于理解。后面我们将提供制作好的CHM帮助文档,供使用参考。SKGL中总共有5个类,其中比较核心的只有3个类,另外2个是抽象基类以及内部核心方法。所以主要看看3个核心类:

2.1 SerialKeyConfiguration类

SerialKeyConfiguration是序列号配置类,继承自BaseConfiguration抽象配置基类。其主要作用是存储机器码,以及生成序列号说需要的一些特征字段。目前配置里面默认有8个特征配置项,通过选择不同的配置特征项,可以更加灵活生成序列号加密方案。SerialKeyConfiguration作为核心类,在序列号的生成和验证中都有用到。

2.2 Generate类

Generate类也是继承BaseConfiguration的类,作用是根据配置类生成说需要的序列号。里面有密钥的设置,以及生成序列号的核心函数doKey,里面的逻辑也不是很复杂,主要是根据需要生成的类型,如时间限制,是否有机器码来进行判断,然后调用内部方法来生成序列号。

2.3 Validate类

Validate类也是继承BaseConfiguration类,因为验证是一个解密的逆向过程,也需要用到配置相关的项。类的主要作用是验证序列号是否合法,是否过期等功能,也是要调用核心的内部类进行解密。总体来说思路是很简单的,关于具体的实现过程,暂时没必要深究,可以查看源代码进行详细的理解。

3.SKGL核心功能调用

这个组件一个是核心类,1个是非常成熟可以直接使用的UI界面,UI界面的代码是VB.NET,很简单。这里我将演示几种使用方法,来调用核心的SKGL组件来完成序列号的生成和解密功能。使用之前添加引用,新建项目这些东西就不必说了。直接进入主题吧。

1.创建Key

创建key使用Generate类,主要有3个重载方法,下面的例子很简单的进行了演示,看代码注释即可理解。

//1.创建key生成对象
var CreateAKey = new Generate();
//2.设置密钥
CreateAKey.secretPhase = "testdemo";
//3.生成key,30天时间限制
var key1 = CreateAKey.doKey(30);
//4.还可以设置机器码以及设置起始日期,机器码是1个5位Int数
var key2 = CreateAKey.doKey(30, 61125);
Console.WriteLine("Key 1 :"+key1);
Console.WriteLine("Key 2 :"+key2);

结果如下,第2个key使用了本机的机器码,我们在下面的代码中将进行验证:

Key 1 :MFZIL-NSTBB-DLLXZ-RFHYV
Key 2 :JPVFS-BLQOQ-FLFTN-HXLFW

2.验证Key

验证key是一个逆向过程,使用Validate类,我们使用上面代码生成的key和配置来进行验证。代码如下,具体看注释:

//1.创建key验证对象
var ValidateAKey = new Validate();
//2.设置密钥
ValidateAKey.secretPhase = "testdemo";
//3.设置要验证的key,注意,这是上面代码生成的key1内容
ValidateAKey.Key = "MFZIL-NSTBB-DLLXZ-RFHYV";           
//4.直接验证是否被修改
Console.WriteLine("Key 1 验证:{0}" , ValidateAKey.IsValid);
//5.检查key是否过期,false说明在有效期内
Console.WriteLine("Key 1 有效期:{0}", ValidateAKey.IsExpired);
//同样验证Key2
ValidateAKey.Key = "JPVFS-BLQOQ-FLFTN-HXLFW";
//检查密钥是否被修改
Console.WriteLine("Key 2 验证:{0}", ValidateAKey.IsValid);
//我电脑的实际机器码是 61125,所以结果是不一样的
Console.WriteLine("Key 2 是否和当前机器的机器码一样:{0}", ValidateAKey.IsOnRightMachine);

结果如下:

Key 1 验证:True
Key 1 有效期:False
Key 2 验证:True
Key 2 是否和当前机器的机器码一样:False

如上图可以验证密钥是否修改,以及是否过期,以及对应的机器码是否和本机一样。在实际使用中,如果要锁定机器,必须先获得机器码,然后生成对应的才行。

3.高级应用之特征值

在源代码以及上面的解说中,我们提到了,在SKGL中,有一个特征码属性:Features,是1个长度为8的布尔数组。它有什么作用呢?

简单的说,设置这个属性,可以让你定义密钥的使用在不同的环境或者版本中。例如应用程序发布后,可能会有试用版,个人版,专业版等等不同版本。实际使用的时候就可以拿出其中的位来设置是否是某一个版本,或者某一个功能类型。SKGL在实际的验证中,也会对这些特征进行验证,从而根据序列号的类型来使用对应的功能。下面我们使用1个简单的例子,演示如何使用这个特征码属性。这个属性需要在生成或者验证的配置对象中进行设置:

3.1 配置生成对应版本的Key

比如8个特征码,选择其中1个设置是否为时间限制的试用版。如下面代码和注释:

//配置对象
SerialKeyConfiguration skc = new SerialKeyConfiguration(); 
//生成key对象
Generate CreateAKey = new Generate(skc);
//
string trialKey = CreateAKey.doKey(30); //试用版30天期限
//创建1个有时间限制的试用版
skc.Features = new bool[8] { true, false, false, false,false, false,false ,false };
// 当然这里的版本可以自定义,只要你自己认识就行了

这里设置的位置的意义,在自己的程序中你认识就行了。

3.2 解密获取Key的特征功能

下面是对应的一个解密后验证功能的代码例子:

//配置对象
SerialKeyConfiguration skc = new SerialKeyConfiguration();
//验证对象
Validate ValidateAKey = new Validate(skc);
ValidateAKey.Key = textBox4.Text; // 对比输入的序列号
{
if (ValidateAKey.IsValid)//如果没有被修改
{   //验证特征码是否符合某些版本的特征
if (ValidateAKey.Features[0] == false)
{
//TODO:
}
if (ValidateAKey.Features[0] == true)
{
//TODO:
}
//TODO:
 }
else
{
//TODO:
}
}

总的来说,这个组件基本功能都满足了,非常值得一用。至于思路,大家可以做成网站验证或者生成注册码的。自己写一个其实也挺费劲的,在一般的软件中是足够了。

5.资源

源码不复杂,在学习过程中,就顺便把它给翻译了。所以这里奉献我翻译后的源代码以及Demo,以及制作的帮助文档。上个图:

翻译后的源码与Demo,托管在Github,我不会告诉你网址在这里的:https://github.com/asxinyu/SKGL

.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用的更多相关文章

  1. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...

  2. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  3. .NET平台开源项目速览(5)深入使用与扩展SharpConfig组件

    上个月在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧  和 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 中都提到了SharpConfig组件,简单轻量级 ...

  4. .NET平台开源项目速览(21)Cron任务调度CronNET

    如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里 ...

  5. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  6. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

  7. .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下FluentValidation验证组件.那里只是概述了一下,并没有对其使用和强大功能做深入研究 ...

  8. .NET平台开源项目速览(4).NET文档生成工具ADB及使用

    很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧 ...

  9. NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)

    原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_FluentValidation_1.html 阅读目录 1.基本介绍 ...

随机推荐

  1. 【DP】HDU 1260

    HDU 1260 Tickets 题意:有N个人要买票,你可以一个一个人卖票,时间分别为Xs,也可以相邻两个人一起卖票,时间为Ys,从早上八点开始卖票,问你何时最早将N个人的票卖完. 思路:解决情况是 ...

  2. swift-func(函数)

    函数是一个组织在一起语句集合,以执行特定任务. Swift 函数类似于简单 C 函数以及复杂的 Objective C 语言函数. 它使我们能够通过函数调用内部的局部和全局参数值. 像其他任何语言一样 ...

  3. 使用canal分析binlog(二) canal源码分析

    在能够跑通example后有几个疑问 1. canal的server端对于已经读取的binlog,client已经ack的position,是否持久化,保存在哪里 2. 即使不启动zookeeper, ...

  4. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  5. Php:学习笔记(一):版本选择

    (注:本文来自网络) 超过75%的网站使用了PHP作为开发语言,wordpress,phpmyadmin和其他一些开源项目的盛行,带来了一大批的长尾用户.然而,他们一般安装之后却很少升级.下图是目前P ...

  6. MySQL 表分区 报错:Table has no partition for value XXX

    对已存在的未分区的表进行分区 alter table test PARTITION BY RANGE(id) (PARTITION p1 VALUES LESS THAN (101),PARTITIO ...

  7. poj3629

    //(队列)poj3629 /* #include <iostream> #include <queue> #include <algorithm> using n ...

  8. sql编写将时间转换年月日 时分格式

    SELECT SUBSTRING(CONVERT(varchar(100),时间字段, 22),0,15) AS aa  FROM  表名

  9. Delphi中stringlist分割字符串的用法

    Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...

  10. GIT和SVN之间的区别及基本操作对比

    1)GIT是分布式的,SVN不是: 这是GIT和其它非分布式的版本控制系统,例如 SVN,CVS等,最核心的区别.如果你能理解这个概念,那么你就已经上手一半了.需要做一点声明,GIT并不是目前第一个或 ...