C#通过依赖项以及当前时间生成动态密码

引言:

手机上安装了QQ令牌,很好奇这个是怎么做出来的,构思了一下,写出来了一个垃圾版。

标题中所说的依赖项是指在令牌中的机器号,在这里我使用邮箱来代替。

另外并没有存储生成的密码,也就是说,不会对该密码是否使用过来进行判断。

先放出一张效果图:

20121223082812

思路:

首先需要有一个类,这个类是公共的,也是最关键的,客户端与服务端同时调用,这个类通过传入的时间以及传入的依赖项生成一个密码列表。

2012-12-23 8-53-593

密码列表出来了,只需从这个密码列表中随机出来一枚即可,当然,我承认我是无聊才会弄这么一堆密码的。。。

客户端的密码同上生成。

但是关键的是服务器的判断,因为很多时候服务器的时间与客户端的时间是会有差别的。

比如说当前时间为: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]

19 Replies to “C#通过依赖项以及当前时间生成动态密码”

回复 缥缈风飞舞 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据