一篇文章通透理解序列号实现原理

您所在的位置:网站首页 什么是注册机,注册机原理 一篇文章通透理解序列号实现原理

一篇文章通透理解序列号实现原理

2024-07-02 06:07| 来源: 网络整理| 查看: 265

1.序列号的本质

序列号等价于注册码,是软件发行商的一种维权手段,也就是正版软件的一个身份证。本质:防止盗版、按功能收费等。 目前,商用软件和共享软件绝大部份都是采用注册码授权的方式来保证软件本身不被盗用,以保证自身的利益。尽管很多常用的许多软件系统的某些版本已经被别人破解,但对于软件特殊行业而言,注册码授权的方式还是一种保护软件系统本身的一种有效的手段。 序列号一般会和产品的名称(具体到硬件产品的型号、软件产品的版本号)、产品的使用期限(具体到截止日期)一起发布。 以下是一款我曾经试用过的美国软件产品Silver-peak注册码/序列号申请回复邮件的全文:

Hello, The license key for your Silver Peak trial is ready to be installed. This is one of two mails you will receive with unique license keys. Deploy the Silver Peak Virtual Appliance you downloaded at each end of the WAN link you plan to optimize. Once deployed, install the unique license key below on one appliance and the unique license key from the second email on the other appliance to enable optimization. Product: VX-2000 License Key: P6F0-lBmL-34Pm-IZ3m-3MGL-s2ND-eLKC-+3pe-HROq-VMGQ-spH/-kOBb-LJOV-QC3p-nPw1-OJGy-KUem-egFc-sXWB-uDwm-goPa-gw== Your license will expire on: Mon Jan 19 2015 Before you start your trial, we recommend you visit the Silver Peak Marketplace website and read the ‘Getting Started’ page: http://marketplace.silver-peak.com/products/vx-virtual-software/vx-2000.html If you have any questions about installing and configuring your virtual appliance, you can contact the Silver Peak support team directly. The support team can be reached in one of three ways: Via the support center at http://www.silverpeaksystems.com/support/portal_login.asp (you should have received an email with instructions on how to enable your account) By phone at 877-210-7325 / 408-935-1850 By email at [email protected] 2.序列号/注册码的原理

一般是以计算机硬件(如主板,网卡,硬盘)的唯一序列号作为注册源,通过一定的算法(即注册机)形成所谓的注册码。一般的程序通过在程序中设置一个全局变量来进行注册码的记录。 Windows下次数可以在注册表里设置一个键值来判断,若有此键,则说明已经到期。(网上说法,个人感觉不可靠,因为注册表也可以修改。) 一般情况下软件的注册是通过比较来实现的,也就是说软件本身就是注册机,因为他本身就有个真正的注册码,用他来和你所输入的注册码做比较。不过有的是明码比较有的是加密比较,以明码比较来说:我们已经知道了软件自己可能会产生注册码的有的在内存中有的在软件中有的在注册表中,更有甚者是有个通用的万能注册码。 输入注册码成功是因为软件中用了跳转,也就是说。当你输入的号码和真正的注册码比较完的时候有个跳转。 大部分注册算法的原理是:软件或者用户自己触发了软件的注册模块软件跳转到注册认证模块。弹出注册窗口用户输入注册名+注册码A,把它们存放在内存中。然后软件的注册码验证部分根据用户输入的注册名生成正确的注册码B并和用户输入的注册码A做对比。如果结果为相同则注册通过,并运行“注册成功”后面的程序分支,比如解除各种软件限制。如果不相同则提示“无效的注册码,请重新输入!”或者“Invalid key!”等等警告。如下图所示: 这里写图片描述 图 1 注册截图 原理摘自:http://blog.csdn.net/jacky_think/article/details/4565241

3.注册码/序列号授权分类

通常而言,注册码授权方式有以下几种方式: (1)安装序列号方式 这是最为常用的方式,Mircosoft提供的产品(例如:Windows系列产品、Office系列产品等等)都是采用这种方式。通过一种复杂的算法生成安装序列号,在安装过程中,安装程序对用户输入的安装序列号进行校验来验证该系统是否被合法,从而完成授权。 这里写图片描述 图 2 Windows安装序列号方式 (2)用户名+序列号方式 即软件系统的供应商给用户提供有效的用户名和序列号,用户在安装过程或启动过程中输入有效的用户名和序列号,系统通过算法校验通过后完成软件授权。 这里写图片描述 图 3 用户名+序列号方式 (3)在线注册方式 用户安装系统后,通过网络进行注册授权。软件系统的供应商事先已经登记了用户的信息,用户在线注册时,供应商的注册系统对用户的信息进行验证。用户身份有效时,注册系统生成一个凭证信息,软件系统根据凭证信息完成授权。 这里写图片描述 图 4 在线注册方式

(4)激活码方式 用户安装系统后,软件系统会根据用户机器的关键信息(例如:MAC地址、CPU序列号、硬盘序列号等等)生成一个注册凭证(也可称为注册码),用户将这个注册凭证发送给软件供应商,供应商通过注册凭证生成一个激活码。用户输入激活码,软件系统完成授权。 这里写图片描述 图 5 激活码方式

4.注册码/序列号组成

(1)产品版本:限定具体到哪个版本、同产品的其他版本不能用。 (2)到期时间:限定截止服务运行时间,到给定截止前一周会有界面提示和邮件提醒。 (3)唯一标识:限定一个软件产品和MAC地址或者磁盘UUID(linux系统)/GUID(Windows系统)绑定。 (4)预留字段:用于分模块限定核心功能、分模块收费等。 以下是Silver-peak产品序列号使用期限截止前一周前邮件提示全文: Hello, This is to notify you that the Proof of Concept currently in process at [email protected] will expire on Wed Jan 21 2015. This affects the following appliances, shipped on Mon Dec 22 2014: VX-2000, S/N 001BBC03A8E9 VX-2000, S/N 001BBC03A8EA If you have questions, please contact your account executive (Tricia Png, [email protected]). Thank you, Silver Peak Systems

5.获取机器的唯一标识

上面的分析可知,我们的软件肯定要安装到硬件设备上,为了管控乱拷贝现象或盗版使用现象,必须获取硬件设备的唯一标识。通过该唯一标识生成注册码/序列号。 有了设备的唯一编号,我们就可以实现更好的软件的授权机制,还可以利用它来限制客户端软件访问后台服务的权限,从而提高系统的安全性。 通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。 UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。另外我们也可以在e2fsprogs包中的UUID库找到实现。 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了全局唯一的IEEE机器识别号、纳秒级时间、芯片ID码和许多可能的数字。 如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同(实际测试结果每次都不同)。即每次生成的UUID都是不同的。 UUID由以下几部分的组合:

1 全局唯一的IEEE机器识别号。(如果有网卡,从网卡MAC地址获得;没有网卡,以其他方式获得)2 纳秒级时间3 芯片ID码4 许多可能的数字

UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个x是0-9 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)

5.1不同操作系统设备的唯一标识

(1)Windows系统GUID 全局唯一标识符,简称GUID(发音为/ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软对UUID标准的实现。 GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。 [维基百科] https://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%E7%AC%A6

(2)Linux系统UUID Linux UUID的作用及意义 原因1:它是真正的唯一标志符 UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题。 原因2:设备名并非总是不变的 自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。 使用UUID对于挂载移动设备也非常有好处──例如我有一个24合一的读卡器,它支持各种各样的卡,而使用UUID总可以使同一块卡挂载在同一个地方。 原因3:ubuntu中的许多关键功能现在开始依赖于UUID。

【长度缩减可以Base64编码】 https://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%E7%AC%A6

5.2获取唯一标识方法

(1)Windows系统机器或者Linux系统机器获取方法 这里写图片描述 图 6 Windows机器的Guid 这里写图片描述

图 7 Linux机器的uuid Windows系统&Linux系统获取uuid统一通用代码(已经测试过,测试结果见上面截图):

#include #include #include #ifdef WIN32 #include #else #include #endif using namespace std; #define MAX_LEN 128 /* **@brief: get windows guid or linux uuid **@return: string type windows guid or linux uuid */ string GetGuid() { char szuuid[MAX_LEN] = {0}; #ifdef WIN32 GUID guid; CoCreateGuid(&guid); _snprintf_s( szuuid, sizeof(szuuid), "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); #else uuid_t uuid; uuid_generate(uuid); uuid_unparse(uuid, szuuid); #endif return std::string(szuuid); } int main() { string strGuid = GetGuid(); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3