本文主要介绍“C#序列号非重复设计的实现方法是什么”。在日常操作中,相信很多人对C#序列号非重复设计的实现方法有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“C#序号非重复设计的实现方法是什么”的疑惑!接下来,请和边肖一起学习!
序列号设计
作为序列号软件的许可方式之一,它被广泛应用于应用软件中。主要考虑这几个方面:1。毕竟知识产权保护需要脑力劳动和体力劳动。2.增加商业竞争中的防御能力,防止竞争对手窃取。3.增强合同效力,防止对方以各种理由破坏合作机制。
基于以上几个方面,有必要从保护和防御思维方式的角度,增加序列号功能。每个作者或公司设计序列号的方式不同,这就是为什么我们可以增加这个功能。
00-1010序列号越短越好。
主要是从成本的角度。例如,用户需要现场正版软件的序列号。如何将序列号信息传递给用户?假设我们以对称或非对称的方式生成一个长序列号。如果我们口头告诉对方,那么对方必须用纸和笔记录下来,最后输入软件后可能不正确。如果序列号以文件的形式通过网络传输给对方,需要占用网络资源,对方的电脑不一定有网络环境。无论如何,长序列号的生成和传输可能涉及的成本包括:材料成本、流动成本、人工成本和时间成本。
如果一个字符能表达序列号所要求的完整信息,那是最理想的。但是,这是一个理想的状态,这是不可能的,至少以我现在的能力。因此,序列号的所有信息都应该用最佳长度来表示。
为了避免混淆字符,会生成一个序列号并发送给用户。序列号包括:数字0和字母O,数字1和字母l,不让用户反复尝试?这种用户体验太差了。虽然你不说,但至少你不觉得舒服。
14.1 设计原则
设计的思路取决于序列号应该实现什么样的功能和属性。从功能上看,它包括:1。计算机的序列号;2.虽然输入条件相同,但每次生成的序列号不同;3.核实使用期限;4.序列号有注册时间限制。如果超过指定的使用时间,序列号将无效,以避免在短时间内多次注册。从属性上来看,包括:同一台计算机生成的序列号和相同的输入条件是不同的。
考虑到上述因素,序列号长度为25个字符,序列号生成格式和元素信息如下:
X01-X05:是电脑的特征码,一个5位数的字符串,可以得到机器某个部件的ID。这部分可能是CPU、网卡、硬盘等信息。ID用MD5加密后,前5个字符作为特征码,实现一机一码。这样,格局可能会有同样的情况,但概率很小。
X06-X13:是序列号生成的日期,8位字符串,格式为yyyyMMdd。结合后期使用时限使用,验证软件的使用寿命。
X14-X15:是注册时限,2位数字,从序列号生成之日算起。如果超过此注册时间限制,序列号将无法正常注册。
X16-X20:使用时限的5位字符,与序列号生成日期一起使用,以验证软件的使用寿命。
X21:是序列号的偏移量,1位字符。无论什么场景,序列号的偏移量每次都不一样。
X22-X25:预留数据位,暂时不用。自定义一个序列号字典信息,例如:_ dictionary=' JCB 8e 2h 7k 6 MVP 9qr 3tx wy4 ',并删除混淆字符。这个可以定制。序列号的每个部分将字典移动随机产生的偏移量(X21),并根据与字典对应的输入数字信息的下标提取相应的字符作为序列号的字符。
生成序列号的一般过程:
在字典信息的长度范围内随机生成一个偏移量。
根据偏移量向左或向右循环字典。
根据输入的数字信息,如2015年的2,作为下标,从字典信息中提取对应的字符。
反向解析的大致过程类似。它只需要根据X21字符匹配字典中的字符,并以对应的下标作为偏移量,就可以对所有信息进行反向解析。
14.2 设计思想
nbsp; 代码实现
1.MD5操作类:
1234567891011121314 | public class Safety { public static string MD5( string str) { string strResult = "" ; MD5 md5 = System.Security.Cryptography.MD5.Create(); byte [] bData = md5.ComputeHash(Encoding.Unicode.GetBytes(str)); for ( int i = 0; i < bData.Length; i++) { strResult = strResult + bData[i].ToString( "X" ); } return strResult; } } |
2.注册信息类:
12345678910111213141516 | public class RegInfo { public RegInfo() { KeySn = "" ; Date=DateTime.MinValue; RegLimitDays = 0; UseLimitDays = 0; Offset = 0; } public string KeySn { get ; set ; } public DateTime Date { get ; set ; } public int RegLimitDays { get ; set ; } public int UseLimitDays { get ; set ; } public int Offset { get ; set ; } } |
3.偏移操作类型:
12345 | internal enum OffsetType { Left, Right } |
4. 序列号管理类
+ View Code
14.4 代码混淆
从安全角度来讲,.NET程序如果不加混淆的话,很容易被反编译出源代码的。从专业角度来讲,即使增加了序列号功能,也无济于事,专业的人员分分钟可以破解掉,尽管这样干的人很少,但是存在这种可能性。如果一个软件人员想了解一个很好的软件,第一反映可能就是反编译。
对于公司或商业使用的软件来讲,增加混淆还是有必要的,尽管现在开源很流行。
14.5 代码破解
不管.NET程序如何进行混淆,理论上都是可以破解的,理论的东西就不赘述了。通常接触过的破解方式有两种:注册机方式和暴力方式。
注册机的方式,需要通过软件的验证序列号的过程和机制反向推算出序列号的生成算法,根据反推的算法开发一个小软件,用于生成脱离作者授权生成序列号。这种方式不会破坏程序本身的代码,相对温和。暴力的方式,就是找到序列号验证部分的代码,通过删除或绕过验证代码等方式不让代码有效执行。这种方式会对程序本身的代码进行改动,所以也存在一些风险。
14.6 小结
实现序列号有多种方式,上述方式不一定最好,但是希望对开发者有一定帮助。
最终实现效果图如下:
到此,关于“C#序列号的设计不重复的实现方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/118933.html