软件授权过程

1.启动软件检测是否注册

打开软件以后,校验是否注册 ,如果没有注册 ,则强出软件注册窗口, 并获取机器的授权码。

1589556099709

如果已经注册,则成功进入软件系统。

2.提示注册

点击注册,会弹出对话框 ,选择密钥文件 ,进行对软件的注册 。

3.软件序列号生成。

1589556185669

选择到期时间 ,和机器编码和机构名称 。 并输入从用户处获取的机器码。点击生成授权文件 。

然后把这个授权文件发给用户。

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))

本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论