网站使用时间限制的实现

最近项目中有个需求,大致说起来就是:公司上线了一个网站,但是需要对这个网站做使用时间限制,也就是常说的授权。

由于时间紧迫,我的实现思路如下:

1、编写注册机代码,用注册机形成授权文件,授权文件为一个xml字符串,包括开始时间与结束时间节点,然后用加密方法对形成的xml字符串加密

2、将授权文件放到网站发布目录下,修改原网站中的代码,解析授权文件中加密的字符串并进一步判断

实现代码如下:

注册机部分代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Base_64 bs = new Base_64();

            DateTime dtkssj = dtpKssj.Value;

            string ksrq = dtkssj.ToString("yyyy-MM-dd");

            DateTime dtjssj = dtpJssj.Value;

            string jsrq = dtjssj.ToString("yyyy-MM-dd");

            string xmlString = "";            

            xmlString += "<KSRQ>" + ksrq + "</KSRQ>";

            xmlString += "<JSRQ>" + jsrq + "</JSRQ>";

            string jmzf = bs.encrypt(xmlString);

            string dirPath = Application.StartupPath;

            string filePath = dirPath + "\\" "授权文件,.ini";

            if (!File.Exists(filePath))

            {

                File.Create(filePath);

            }

            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);

            StreamWriter sw = new StreamWriter(fs);

            fs.SetLength(0);

            sw.Write(jmzf);

            sw.Close();

            MessageBox.Show("注册成功");   

   注册机的主体实现思路如上文所说,用特定格式的xml字符串控制,然后用特定方式加密。

加密类的部分代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

public string encrypt(string str)

    {

        int len = str.Length;

        if (str == null)

            return "";//throw new Exception("NULL pointer.");

        if (len == 0)

            return str;

        string pTmp = "";

        pTmp = str;

        string dest = "";

        for (int i = 0; i < len; i++)

        {

            char ch = pTmp[i];

            int idx1 = ch >> 2 & 0x3f;

            int idx2 = ch << 4 & 0x30;

            dest += s_keys[idx1];

            if (++i == len)

            {

                dest += s_keys[idx2];

                break;

            }

            //ch = pTmp.charAt(i);

            ch = pTmp[i];

            idx1 = idx2 | ch >> 4 & 0xf;

            idx2 = ch << 2 & 0x3f;

            dest += s_keys[idx1];

            if (++i == len)

            {

                dest += s_keys[idx2];

                break;

            }

            ch = pTmp[i];

            idx1 = idx2 | ch >> 6 & 0x3;

            idx2 = ch & 0x3f;

            dest += s_keys[idx1];

            dest += s_keys[idx2];

        }

        return dest;//dest.toString();

    }

  解密类的部分代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

public string decrypt(string str)

    {

        if (str == null)

            return "";//throw new Exception("NULL pointer.");

        int len = str.Length;

        if (len == 0)

            return str;

        string dest = "";

        //StringBuffer dest = new StringBuffer();

        for (int j = 0; j < len; j++)

        {

            char ch = str[j];

            int i;

            for (i = 0; i < 64; i++)

                if (s_keys[i] == ch)

                    break;

            char tempDest = (char)(i << 2);

            if (++j == len)

            {

                dest += tempDest;

                //dest.append(tempDest);

                break;

            }

            ch = str[j];

            for (i = 0; i < 64; i++)

                if (s_keys[i] == ch)

                    break;

            tempDest |= Convert.ToChar(i >> 4);

            dest += tempDest;

            //dest.append(tempDest |= i >> 4);

            int temp = (i & 0xf) << 4;

            if (++j == len)

                break;

            ch = str[j];

            for (i = 0; i < 64; i++)

                if (s_keys[i] == ch)

                    break;

            dest += (char)(temp | i >> 2);

            //dest.append((char)(temp | i >> 2));

            temp = (i & 0x3) << 6;

            if (++j == len)

                break;

            ch = str[j];

            for (i = 0; i < 64; i++)

                if (s_keys[i] == ch)

                    break;

            dest += (char)(temp | i);

            //dest.append((char)(temp | i));

        }

        return dest;//dest.toString();

    }

网站部分解密授权文件部分代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

string dirPath = Server.MapPath("");

        string filePath = dirPath + "\\" "授权文件.ini";

        if (!System.IO.File.Exists(filePath))

        {

            //没有授权文件 显示未授权

        }

        else

        {

            System.IO.StreamReader sr = new System.IO.StreamReader(filePath, Encoding.UTF8);

            string content = sr.ReadToEnd().ToString();

            sr.Close();

            Base_64 bs1 = new Base_64();

            string jmzf = bs1.decrypt(content);

            System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();//实例化一个XmlDocument对像

            xmldoc.LoadXml(jmzf);

            System.Xml.XmlNode xnKsrq = xmldoc.SelectSingleNode("KSRQ");

            string ksrq = xnKsrq.InnerText;

            System.Xml.XmlNode xnJsrq = xmldoc.SelectSingleNode("JSRQ");

            string jsrq = xnJsrq.InnerText;

            DateTime dtKsrq = Convert.ToDateTime(ksrq);

            DateTime dtJsrq = Convert.ToDateTime(jsrq);

            DateTime dtNow = DateTime.Now.AddDays(1);

            int ks = DateTime.Compare(dtKsrq, dtNow);

            int js = DateTime.Compare(dtJsrq, dtNow);

            if (ks > 0 || js < 0)

            {

                //显示授权到期

            }

        }

在网站代码中直接获取到这个授权文件,然后用对称的方式解密并判断授权的开始日期与结束日期与服务器日期做比对。

总结:代码很简单,甚至是有点简陋,这里希望抛砖引玉,有没有更好的实现思路?这种用文件授权的方式进行的加密是不是容易被破解?。。。

还望各位赐教.....

时间: 2024-08-24 01:27:40

网站使用时间限制的实现的相关文章

大型网站架构改进历程:存储的瓶颈(五)

摘要:什么是大型网站,从网站的技术角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点行的人也许会认为是网站在单位时间里的并发量的大小来作为指标,如果按这些标准那么像hao123网站就是了. [编者按]本文转自博客园的 夏天的森林,在看这篇之前,大家可以移步看 大型网站架构改进历程:存储的瓶颈(一).(二).(三).(四). 上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种

前端编程提高之旅(二)----网站常见特效的jquery实现

最好的编程语言是逻辑,前端各种交互特效的实现多可以用jquery实现,特效可以纷飞,内在逻辑则基本不变.这一篇文章主要介绍jquery实现常见特效背后的逻辑.    1.通过类名获取元素集合    首先来看一个js原生代码不支持的方法,通过类来获取元素集合. document.getElementsByClassName=function(classname){ var retnode = []; var myclass = new RegExp('\\b'+classname+'\\b');/

关于大型网站技术演进的思考(五)--存储的瓶颈(5)

原引:http://www.cnblogs.com/sharpxiajun/p/4265853.html 上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种影响,第二个问题就是水平拆分的扩容问题.这两个问题在深入下去,本系列就越来越技术化了,可能最终很多朋友读完后还是没有找到解决实际问题的启迪,而且我觉得这些问题都是像BAT这样巨型互联网公司才会认真思考的,因此本篇我打算换个角度来阐述本文的后续内

天空象棋——网站与用户

上一篇文章<天空象棋——冲上云霄>介绍了如何把天空象棋的算法服务发布到Azure上,以及提供了一个使用该云服务的象棋客户端.这次的任务是为天空象棋在Azure上创建一个网站,并且提供用户注册.登陆的功能.涉及以下知识点: 在Azure上创建网站 使用Visual Studio发布自定义网站 使用SQL Server Management Studio连接Azure数据库服务器 为网站提供Membership服务 创建天空象棋网站 登陆Azure管理网站,依次点击“+NEW”,“COMPUTE”

关于大型网站技术演进的思考--存储的瓶颈(转)

(一)第一部分 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难完整理出全部听到的知识,今天我换了个思路是回味这次培训,这个思路就是通过本人目前的经验和技术水平来思考下大型网站技术演进的过程. 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技术指标角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点行的人也许会认为是网站在单位时间里的并发量的大小来作为指标,如果按这些标准那

网站建设:强烈推荐使用第三方云存储

随着网站建设的使用时间越来越长,我们的网站可能使用了越来越多的图片.CSS以及js文件,虽然这些的大小都不大,但如果请求的次数多了,这些文件的大小加起来就是一个可观的大小了!而且,如果你们页面图片或者js等文件多了,并且你的网站访问速度不太快的话,这会严重影响到你网站的访问速度! 今天给大家推荐一个静态文件存储的云储存:七牛云存储(点击这里),它提供了免费使用云存储的功能:普通用户每月可以免费使用10GB的存储空间.每月免费下载的流量达到10GB.每月免费PUT/DELETE 10万次请求以及每

sharepoint2010人性化的地方--员工离职AD账号禁用(个人网站自动提醒上级经理功能)

sharepoint2010人性化的地方--员工离职AD账号禁用(个人网站自动提醒上级经理功能) 最近有个项目,每个员工都开通了个人网站,但是有些员工离职后禁用AD账号后自动给该员工的个人属性中的“上级经理”指定的经理发一份提醒邮件如下: XXX/Hunk 的“我的网站”已计划在 14 天内删除.作为他们的经理,您现在是其网站的临时所有者.此临时所有权使您可以访问该网站,复制您可能需要的与企业相关的任何信息.若要访问该网站,请使用以下 URL:http://mysite.xxx.com/pers

大型网站架构改进历程-转 (刚进博客园就看到这么一篇好文章感触颇深)

存储的瓶颈(1) 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难 完整理出全部听到的知识,今天我换了个思路是回味这次培训,这个思路就是通过本人目前的经验和技术水平来思考下大型网站技术演进的过程. 大型网站定义 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技术指标角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点 行的人也许会认为是网站在单位时间里的并发量的大小来作为指

【转】关于大型网站技术演进的思考(五)--存储的瓶颈(5)

上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种影响,第二个问题就是水平拆分的扩容问题.这两个问题在深入下去,本系列就越来越技术化了,可能最终很多朋友读完后还是没有找到解决实际问题的启迪,而且我觉得这些问题都是像BAT这样巨型互联网公司才会认真思考的,因此本篇我打算换个角度来阐述本文的后续内容. 这里我们首先要明确一个问题,到底是什么因素促使我们去做数据库的垂直拆分和水平拆分的呢?答案很简单就是