通用软件注册功能之建立有效的软件保护机制
来源:互联网 发布:微信埋雷软件多少钱 编辑:程序博客网 时间:2024/04/28 20:16
实现软件的注册功能方法很多,最需要考虑的就是不能轻易的让使用者破解,在这里,我就谈谈“.NET快速开发整合框架(RDIFramework.NET)”中平台注册功能的实现方法。在RDIFramework.NET中,注册功能主要方法就是对计算机唯一硬件信息进行RSA数字签名达到软件注册和保护的功能,该方法实现简单,安全性相应较高。
计算机唯一硬件信息(我们知道计算机中的关键部件如CPU,主板等在全球范围内都有一个独一无二的产品序列号,用户通过注册模块获取这些产品序列号(即传统所说的:机器吗)并将它发送给软件开发商要求进行RSA数据签名,软件开发商获得这些机器码后利用手中的私钥对这些信息进行RSA数字签名,生成的签名信息(即注册码)发回给用户,用户将收到的注册码输入注册模块的注册码框,软件即可利用公钥执行签名验证,如果输入的注册码被证明就是经过开发商数字签名的机器码,则完成注册过程。
注册功能项目结构图如下所示:
图1 注册功能项目结构
平台服务端注册码生成主界面如下所示:
图2 注册文件管理器
通过“注册文件管理器”,我们就可以根据用户提供的信息来生成软件的注册文件。
客户端的注册主要就是根据我们提供的注册文件与公钥,来验证注册文件是否为当前客户的有效注册文件,如果有效,注册成功,无效则注册失败!客户端注册功能设计参考如下所示:
图3 平台注册
用户单击“注册”按钮,成功注册提示:
图4注册成功
服务端注册码生成核心代码:
一、 生成公/私钥文件:
1 private void btnGenerateKey_Click(object sender, EventArgs e) 2 { 3 if (MessageBox.Show("确定生成生成公/私钥对吗(是/否)?", "询问信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) 4 == System.Windows.Forms.DialogResult.Cancel) 5 { 6 return; 7 } 8 9 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();10 11 string publicKey = crypt.ToXmlString(true);12 string privateKey = crypt.ToXmlString(false);13 crypt.Clear();14 15 //生成公钥16 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFrameworkkey.key", false, UTF8Encoding.UTF8))17 {18 sw.Write(SecretHelper.AESEncrypt(publicKey));19 sw.Flush();20 }21 22 //生成私钥23 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFrameworkPrivateKey.key", false, UTF8Encoding.UTF8))24 {25 sw.Write(SecretHelper.AESEncrypt(privateKey));26 sw.Flush();27 } 28 29 MessageBox.Show("成功生成公/私钥对!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);30 }
二、 生成注册文件:
1 private void btnGenerateRegisterFile_Click(object sender, EventArgs e) 2 { 3 if (string.IsNullOrEmpty(txtUserEmail.Text.Trim())) 4 { 5 MessageBox.Show("用户邮箱不能为空!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); 6 txtUserEmail.Focus(); 7 return; 8 } 9 else10 {11 if (!RegexValidatorHelper.IsMatch(txtUserEmail.Text.Trim(), Pattern.EMAIL))12 {13 MessageBox.Show("邮箱格式不正确!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);14 txtUserEmail.SelectAll();15 return;16 }17 }18 19 if (string.IsNullOrEmpty(txtCPUSerialNo.Text.Trim()))20 {21 MessageBox.Show("CPU序列号不能为空!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);22 return;23 }24 25 if (!string.IsNullOrEmpty(txtUseLimited.Text.Trim()))26 {27 if (!RegexValidatorHelper.IsMatch(txtUseLimited.Text.Trim(), Pattern.INTEGER))28 {29 MessageBox.Show("使用次数应该为数值型!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);30 txtUseLimited.SelectAll();31 return;32 }33 }34 35 //读取私钥36 StreamReader sr = new StreamReader(KeyPath + "RDIFrameworkPrivateKey.key", UTF8Encoding.UTF8); 37 string keypair = sr.ReadToEnd();38 sr.Close();39 40 //用私钥参数初始化RSACryptoServiceProvider类的实例crypt。41 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();42 43 crypt.FromXmlString(SecretHelper.AESDecrypt(keypair));44 45 UTF8Encoding enc = new UTF8Encoding();46 47 string trialTime = "30";//试用次数(默认:30数,0:表示永久)48 if (!string.IsNullOrEmpty(txtUseLimited.Text.Trim()))49 {50 trialTime = txtUseLimited.Text.Trim();51 }52 string regInfo = txtUserEmail.Text.Trim() + ";" + txtMAC.Text.Trim() + ";" + txtCPUSerialNo.Text.Trim() + ";" + trialTime;53 54 byte[] bytes = enc.GetBytes(regInfo);//格式:邮箱地址;MAC;CPU序列号;试用时间55 //对用户信息加密56 bytes = crypt.Encrypt(bytes, false);57 58 //生成注册数据,对二进制字节进行Base64编码,但采用注册文件的形式的进修也可以不做此转化。59 string encrytText = System.Convert.ToBase64String(bytes, 0, bytes.Length);60 61 //将注册码写入文件62 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFramework_reg_file.lic", false, UTF8Encoding.UTF8))63 {64 sw.Write(encrytText);65 sw.Flush();66 }67 68 MessageBox.Show("注册文件:RDIFramework_reg_file.lic生成成功!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 69 }
三、 验证注册文件:
1 private void btnCheckRegistr_Click(object sender, EventArgs e) 2 { 3 //读取注册数据文件 4 StreamReader sr = new StreamReader(KeyPath + "RDIFramework_reg_file.lic", UTF8Encoding.UTF8); 5 string encrytText = sr.ReadToEnd(); 6 sr.Close(); 7 8 9 //读取公钥10 StreamReader srPublickey = new StreamReader(KeyPath + "RDIFrameworkkey.key", UTF8Encoding.UTF8);11 string publicKey = srPublickey.ReadToEnd();12 srPublickey.Close();13 14 //用公钥初化始RSACryptoServiceProvider类实例crypt。15 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();16 crypt.FromXmlString(SecretHelper.AESDecrypt(publicKey));17 UTF8Encoding enc = new UTF8Encoding();18 byte[] decryptByte;19 try20 {21 byte[] newBytes;22 newBytes = System.Convert.FromBase64CharArray(encrytText.ToCharArray(), 0, encrytText.Length);23 decryptByte = crypt.Decrypt(newBytes, false);24 string decrypttext = enc.GetString(decryptByte);25 //26 //TODO:在此处添加验证逻辑27 //28 MessageBox.Show(decrypttext);29 }30 catch(Exception ex)31 {32 MessageBox.Show(ex.Message);33 }34 }
至此,软件的注册功能就完成了,当然还有其他很多方法,比如:
一、 采用加密狗的方式(最安全的方式)。二、 在线验证注册信息(用户需能上网),这种方式也比较可靠。三、 其他方法,欢迎大家讨论。四、 ......
- 通用软件注册功能之建立有效的软件保护机制
- 通用软件注册功能之建立有效的软件保护机制
- 推荐+1置顶+1(分享、讨论、实现) 通用软件注册功能之建立有效的软件保护机制
- 如何建立有效的.Net软件注册保护机制
- 软件保护技术(软件注册机制)
- 软件保护之注册算法篇
- 软件保护之注册算法篇
- 理解软件保护技术之功能限制的程序
- 建立有效的软件度量过程
- 如何建立有效的软件测试准则?
- C# 软件注册功能
- 软件保护机制小窥
- 有效的软件质量管理
- 有效的软件质量管理
- 有效的软件质量管理
- 简述关于软件加密软件注册通用技术
- 简述关于软件加密软件注册通用技术
- 企业源代码加密软件保护机制
- Android图片异步加载
- Python未来互联网主流语言!
- CSS 图片拼合生成器 http://cn.spritegen.website-performance.org/
- 百度地图API
- 二叉树的学习
- 通用软件注册功能之建立有效的软件保护机制
- 10步让你成为更优秀的程序员
- 如何将AIR应用打包成exe
- .NET Framework 类库 Thread.IsBackground 属性
- Edit控件特殊字符处理类
- cocos2d-x初学笔记03:菜单Menu
- IOS学习笔记(17)集成Twitter的功能
- 每次插入一条数据速度很慢,一次全部插入SQL语句过大,个人解决办法是每次插入指定条数
- PostQuitMessage和ExitProcess的区别是什么?