zoukankan      html  css  js  c++  java
  • Asp.net程序注册的完整实现

        为有效保护软件,有必要实现asp.net程序的注册。本文提出的注册思路主要是,根据服务器端的某些机器码,经过处理后得到ID号。ID号经过加密算法加密后,形成序列号。注册时,用户将ID号告知软件权益所有者,软件权益所有者将序列号告知用户。用户根据此序列号注册时,序列号被保存在数据库中。在asp.net程序中进行注册检查,根据探测服务器端机器码生成的序列号与数据库中的序列号进行比较,如二者一致则为注册程序,反之则为非注册程序。
        为实现此功能,本文提供一个完整的解决方案,主要由以下文件组成。
        reg_forcool.cs,包含了实现注册功能的各种函数,作为封装引用,保存在BIN文件夹下面。
        Reg.aspx和Reg.aspx.cs,注册程序,用户根据程序提供的ID号向软件权益所有者索取序列号进行注册。
        GetSN.aspx和GetSN.aspx.cs,生成序列号程序,根据用户的ID号生成序列号。此程序不提供给用户,由软件权益所有者保存。
        check_reg.aspx和check_reg.aspx.cs,检查是否注册程序,此程序可移植到其它用户必用的重要页面中。


    //以下文件reg_forcool.cs  包含了实现注册功能的各种函数
    //作为封装引用,保存在BIN文件夹下面

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Collections.Generic;
    using System.Text;
    using System.Management;//您需要在解决方案资源管理器中添加引用System.Management
    using System.Security;//您需要在解决方案资源管理器中添加引用System.Security
    using System.Security.Cryptography;
    using System.IO;

    namespace Reg_forcool_NameSpace
    {  
        public class Reg_forcool_Class
        {
           
            /// <summary>
            /// 取得网卡mac地址
            /// </summary>
            /// <returns></returns>
            public string GetNetCardMacAddress()
            {
                ManagementClass mc;
                ManagementObjectCollection moc;
                mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                moc = mc.GetInstances();
                string str = "";
                foreach (ManagementObject mo in moc)
                {
                    if ((bool)mo["IPEnabled"] == true)
                        str = mo["MacAddress"].ToString();

                }
                str = str.Replace(":", "");
                return str;
            }

           
            /// <summary>
            /// C盘序列号
            /// </summary>
            /// <returns></returns>
            public string GetDiskVolumeSerialNumber()
            {
                ManagementObject disk;
                disk = new ManagementObject("win32_logicaldisk.deviceid="c:"");
                disk.Get();
                return disk.GetPropertyValue("VolumeSerialNumber").ToString();
            }

           
            /// <summary>
            /// 取得id号,如果有网卡mac地址则返回c盘序列号,没有则返回c盘序列号
            ///此处没有采用cpu序列号是因为涉及到多核cpu会导致序列号的不唯一性。
            /// </summary>
            /// <returns></returns>
            public string GetId()
            {
                string str = GetNetCardMacAddress();
                if (str == "")
                {
                    str = GetDiskVolumeSerialNumber();
                }
                if (str == "")
                {
                    str = "cccccccc";
                }
                return str;
            }

           
            /// <summary>
            /// (可逆加密)
            /// </summary>
            /// <returns></returns>
            ///注意第二个参数必须为8个或以上的字符,您可以通过修改第二个参数得到不同的序列号 
            public string DesEncrypt(string strText, string strEncrKey)
            {
                byte[] byKey = null;
                byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
                try
                {
                    byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, strEncrKey.Length));
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
                    MemoryStream ms = new MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    return Convert.ToBase64String(ms.ToArray());


                }
                catch (System.Exception error)
                {
                    return "error:" + error.Message + "\r";
                }
            }

          

           
            /// <summary>
            /// 根据c盘或网卡mac地址用加密方法生成序列号
            /// </summary>
            /// <returns></returns>
            public string GetSN_Exterior()
            {
                string id = GetId(); //取得服务器端ID号
                string str = DesEncrypt(id, "forcools");//注意第二个参数必须为8个或以上的字符          
                if (str.Length > 20)
                {
                    str = str.Substring(0, 20);
                }
                str = str.Substring(0, 4) + "-" + str.Substring(4, 6) + "-" + str.Substring(10, 6) + "-" + str.Substring(16, 4);
                return str;
              
            }
            /// <summary>
            /// 根据c盘或网卡mac地址用加密方法生成序列号
            /// </summary>
            /// <returns></returns>
            public string GetSN_Exterior(string id)
            {           
                string str = DesEncrypt(id, "forcools");//注意第二个参数必须为8个或以上的字符          
                if (str.Length > 20)
                {
                    str = str.Substring(0, 20);
                }
                str = str.Substring(0, 4) + "-" + str.Substring(4, 6) + "-" + str.Substring(10, 6) + "-" + str.Substring(16, 4);
                return str;
              
            }

          
           
            /// <summary>
            /// //检查是否注册
            /// </summary>
            /// <returns>注册返回true,未注册返回false</returns>
            public bool CheckReg(string SN)
            {
                string RightSN = GetSN_Exterior();
                bool rst = false;
                if (SN == RightSN)
                {
                    rst = true;
                }
                return rst;
            }
        }
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为Reg.aspx,注册程序,用户根据程序提供的ID号向软件权益所有者索取序列号进行注册
    <%@ Page Language="C#" CodeFile="Reg.aspx.cs" Inherits="forcool_Reg" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>注册</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            ID:<asp:TextBox ID="TextBox1" runat="server" Width="200px"></asp:TextBox>&nbsp;<br />
            序列号:<asp:TextBox ID="TextBox2" runat="server" Width="200px"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text=" 注 册 " />&nbsp;<br />
            <br />
            <asp:Label ID="Label1" runat="server" ForeColor="Red"></asp:Label></div>
        </form>
    </body>
    </html>

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为Reg.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Reg_forcool_NameSpace;

    public partial class forcool_Reg : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
            TextBox1.Text = r_forcool_class.GetId();
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string SN = TextBox2.Text;
            //如果序列号不为空
            if (SN != "")
            {
                Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
                string Right_SN = r_forcool_class.GetSN_Exterior();
                //如果注册成功
                if (SN == Right_SN)
                {               
                    /////////////////////////
                    //在这里将序列号写进数据库,您需要自行添加代码实现此功能
                    ////////////////////////
                    Label1.Text = "注册成功!";
                }
                //如果注册失败
                else
                {
                    Label1.Text = "注册失败!序列号不正确。";
                }
            }
            //如果序列号为空
            else
            {
                Label1.Text = "序列号不能为空";
            }
        }
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为GetSN.aspx,生成序列号程序,根据用户的ID号生成序列号。此程序不提供给用户,由软件权益所有者保存。
    <%@ Page Language="C#" CodeFile="GetSN.aspx.cs" Inherits="forcool_GetSN" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>取得注册序列号</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            请输入ID:<asp:TextBox ID="TextBox1" runat="server" Width="213px"></asp:TextBox>&nbsp;<asp:Button
                ID="Button1" runat="server" OnClick="Button1_Click" Text=" 获 取 " /><br />
            生成序列号:<asp:TextBox ID="TextBox2" runat="server" Width="270px"></asp:TextBox></div>
        </form>
    </body>
    </html>


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为GetSN.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Reg_forcool_NameSpace;

    public partial class forcool_GetSN : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string Id = TextBox1.Text;
            if (Id != "")
            {
                Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
                TextBox2.Text = r_forcool_class.GetSN_Exterior(Id);
            }
        }
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为check_reg.aspx,检查是否注册程序,此程序可移植到其它用户必用的重要页面中。
    <%@ Page Language="C#" CodeFile="check_reg.aspx.cs" Inherits="forcool_check_reg" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>检查是否注册</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
        </div>
        </form>
    </body>
    </html>

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //以下为check_reg.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Reg_forcool_NameSpace;

    public partial class forcool_check_reg : System.Web.UI.Page
    {
        public void Check_Reg()
        {
            //检查注册开始
            Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
            //////////////////////////////////////////////////
            string SN = "";
            //在这里从数据库读取序列号,您需要自行添加代码实现此功能
            //SN = 读取数据库返回的序列号
            //////////////////////////////////////////////////
            if (r_forcool_class.CheckReg(SN) == false)
            {
                //没有注册,强制注册,或者您也可以在此处添加代码以实现其它功能。
                //Response.Redirect("Reg.aspx");
            }
            //检查注册结束
        }
       
        protected void Page_Load(object sender, EventArgs e)
        {
            Check_Reg(); //检查注册
        }
    }

  • 相关阅读:
    PHP解决imagecopymerge合成图片后黑色边角的问题
    cmake简单介绍
    python pytest测试框架介绍七 ---测试用例显示用例注释名称
    docker day001
    C语言 字节数组和hex和互相转换
    glsl 内置数学函数
    springboot分析——自定义启动类
    springboot源码分析——自动配置流程
    springboot源码分析——SPI扩展机制
    springboot分析——与其他组件的整合(JPA规范/atomikos/redis)
  • 原文地址:https://www.cnblogs.com/weixing/p/2114105.html
Copyright © 2011-2022 走看看