软件授权过程
1.启动软件检测是否注册
打开软件以后,校验是否注册 ,如果没有注册 ,则强出软件注册窗口, 并获取机器的授权码。
如果已经注册,则成功进入软件系统。
2.提示注册
点击注册,会弹出对话框 ,选择密钥文件 ,进行对软件的注册 。
3.软件序列号生成。
选择到期时间 ,和机器编码和机构名称 。 并输入从用户处获取的机器码。点击生成授权文件 。
然后把这个授权文件发给用户。
4.原理
4.1 客户的机器码:
通过读取客户的cpu【Win32_Processor-ProcessorId】,
主板【Win32_BaseBoard-SerialNumber】
硬盘id[Win32_PhysicalMedia-SerialNumber]。
组合而成。
4.2 授权码生成
把客户的机器码, 到期时间,机构编码和名称 通过json连接起来以后,取hash值
public string GetHash(string m_strSource)
{
//从字符串中取得Hash描述
byte[] Buffer;
byte[] HashData;
HashAlgorithm MD5 = HashAlgorithm.Create("MD5");
Buffer = Encoding.Default.GetBytes(m_strSource);
HashData = MD5.ComputeHash(Buffer);
return Convert.ToBase64String(HashData);
}
4.3 用rsa私钥对数据进行签名
regInfo.Signature = rsa.SignatureFormatter(privateKey, rsa.GetHash(convert.Serialize(baseInfo)));
public string SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature)
{
byte[] rgbHash = Convert.FromBase64String(m_strHashbyteSignature);
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
key.FromXmlString(p_strKeyPrivate);
RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
formatter.SetHashAlgorithm("MD5");
byte[] inArray = formatter.CreateSignature(rgbHash);
return Convert.ToBase64String(inArray);
}
4.4 保存序列号
净签名对象转为json串,转为字节,再用base64保存到文件 中。 然后发给客户端
RegInfo regInfo = new RegInfo();
RegBaseInfo baseInfo = new RegBaseInfo();
baseInfo.MachineCode = txtMachineCode.Text;
baseInfo.OrganizationCode = txtOrgCode.Text;
baseInfo.OrganizationName = txtOrganization.Text;
baseInfo.ExpiryDate = dateTimePicker1.Value.ToString("yyyy-MM-dd HH:mm:ss");
regInfo.RegBase = baseInfo;
regInfo.Signature = rsa.SignatureFormatter(privateKey, rsa.GetHash(convert.Serialize(baseInfo)));
File.WriteAllText(saveFileDialog1.FileName,
Convert.ToBase64String(Encoding.Default.GetBytes(convert.Serialize(regInfo))),
Encoding.Default);
4.5 客户端验证密钥
客户接收到密钥以后,先从Base64l转成字节,再调用encoding 取得字符串
var infoString = Encoding.Default.GetString(Convert.FromBase64String(regString));
对签名对象进行反序列化,取得相应的注册信息,用rsa的公钥进行签名验证
var infoString = Encoding.Default.GetString(Convert.FromBase64String(regString));
reg = convert.Deserialize<RegInfo>(infoString);
regInfo = reg;
if (rsa.SignatureDeformatter(publicKey, rsa.GetHash(convert.Serialize(reg.RegBase)), reg.Signature))
还不快抢沙发