引言:
手机上安装了QQ令牌,很好奇这个是怎么做出来的,构思了一下,写出来了一个垃圾版。
标题中所说的依赖项是指在令牌中的机器号,在这里我使用邮箱来代替。
另外并没有存储生成的密码,也就是说,不会对该密码是否使用过来进行判断。
先放出一张效果图:
思路:
首先需要有一个类,这个类是公共的,也是最关键的,客户端与服务端同时调用,这个类通过传入的时间以及传入的依赖项生成一个密码列表。
密码列表出来了,只需从这个密码列表中随机出来一枚即可,当然,我承认我是无聊才会弄这么一堆密码的。。。
客户端的密码同上生成。
但是关键的是服务器的判断,因为很多时候服务器的时间与客户端的时间是会有差别的。
比如说当前时间为:2012-12-23_8-58-57
而客户端的时间为:2012-12-23_8-57-34
因此我们需要在服务器端做出多次对比,我做的是5次对比,即:
分钟-1,分钟-2,当前,分钟+1,分钟+2
如果密码匹配正确,则中断继续向下对比,提示登录成功。
关键代码:
/* * By: 落落 * URL: Www.MyLuoLuo.Com */ using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; namespace Generate { /// <summary> /// 密码生成 /// </summary> public class Key { /// <summary> /// 获取密码 /// </summary> /// <param name="dt">当前时间</param> /// <param name="rely">生成密码依赖项</param> /// <returns></returns> public List<string> GetKey(DateTime dt, string rely) { //yyyy-mm-dd HH:ff string key = dt.ToString("yyyymmddHHff"); //关联时间与依赖项 key += rely; /* 以下为屁算法... */ //获取MD5 MD5 md5 = MD5.Create(); byte[] m = md5.ComputeHash(Encoding.Default.GetBytes(key)); //生成一个时间段的密码列表 List<string> list = new List<string>(); for (int i = 0; i < m.Length; i++) { string tmp = String.Empty; for (int j = 0; j < 3; j++) { if (i + j > m.Length - 1) break; tmp += m[i + j].ToString(); } if (tmp.Length > 6) tmp = tmp.Substring(0, 6); if (tmp.Length < 6) continue; list.Add(tmp); } return list; } } }
下载:
[download id=”43″]
[buy]下载需淡定。。。体谅一下吧~
有什么错误的思路也请指出。[/buy]
呃、C#和C++好像差不多而已
实际上,我觉得都差不多.只不过关键字不同罢了.
其实,差好多……C#木有指针啊。
使用unsafe搞一段非托管代码就OK了 http://msdn.microsoft.com/zh-cn/library/t2yzs44b.aspx
unsafe尽量别用……
我没用过…只是听说过= =
还是托管代码好.
处于菜鸟阶段 没看明白
明明不难啊,
额。。。 学习不到一个星期在看视频自学,基础知识还是半吊子。。。
嗯,主要是循环,你应该很快就能看懂。
哦哦
艾玛,竟然用这种流氓网盘~~~不科学啊~~用百度网盘都比这玩意儿好啊~~
不喜欢可以让我发给你嘛.
我战战兢兢的发表评论,因为一不小心看到了右侧的公告.
那个不是给好孩子看的
C# 怎么感觉是一个Java类外面套上一层C++的namespace和using啊??基本上感觉就是一个Java强奸了C++么。。。
随便你怎么想,不过Java与C#确实很像…
我来查看下的哦!!