关闭

使用C++模拟动态密码验证

标签: c++解决方案密码
225人阅读 评论(0) 收藏 举报
分类:

前言

主要是最近特别想写一个保密的网站系统。然后自己大概考虑了一个实现方法,然后经过测试发现有效。后来在网上找有没有更好的解决方案,然后惊奇地发现这方面居然没有人来提供教程。

然后本菜鸡就把自己的方法放送出来,方便大家在进行各种开发的时候使用动态密码算法。

实现原理

其实整个原理是比较简单的。

比如说现在有两个设备,服务端和客户端。

两部设备同时拥有时钟和一套相同的算法。当用户需要一个新的动态密码时,两个设备会通过各自的时钟,使用相同的算法来计算出两个密码。此时,用户手中的密码应该是客户端的密码。在两个设备的时钟相同时,对应生成的密码也相同。用户输入客户端提供的密码到服务器进行验证,若密码相同,则验证通过。

所以现在需要模拟生成密码的算法。我在这里提供了一个很菜的算法,大家可以拿来参考一下。

编程实现

核心函数

这里面最核心的函数是ctime库中的两个函数:

time_t tt=time(NULL);
tm *t=localtime(&tt);

time函数用于获取系统时间,而localtime函数则将time_t数据转换成可读的数据。

读取时间的方法如下:

t->tm_year+1900 //年
t->tm_mon+1     //月
t->tm_mday      //日
t->tm_hour      //小时
t->tm_min       //分钟
t->tm_sec       //秒

使用这些数据来计算一个密码出来。

每隔一段时间修改一次

这个可以通过对秒整除和取余来实现。

比如说,我想让这个代码20秒换一次,那么我就可以:

sec=sec/code_time+1;

这样一来,sec变量中存储的值只有20秒才会变化一次。

主程序

安全验证

这个并不是必要的,只是为了防止任何人都能轻易使用这套程序。

//以下为全局内容

string password="123456";
string input()
{
    char geted=getch();
    string outed;
    while(geted!=13)
    {
        cout<<"*";
        outed+=geted;
        geted=getch();
    }
    cout<<endl;
    return outed;
}

//以下为主程序中的内容

    cout<<"Current security code : UNKNOWN"<<endl;
    cout<<"Code change : UNKNOWN"<<endl;

    string check;
    int timesss=1;
    for(timesss=1;timesss<=3;timesss++)
    {
        cout<<"Security pass required : ";
        check=input();
        if(check==password) break;
        else cout<<"[ERROR]Invalid pass! Chances remained : "<<3-timesss<<endl;
    }
    if(timesss>3)
    {
        cout<<"[DENIED]SECURITY PASS FAILED!"<<endl;
        getch();
        return 0;
    }

这个小型密码安全验证提供三次输入密码机会,并且自动将输入的密码变成“*”,以增加安全性。

生成器

使用这个函数来根据当前时间计算一个新的动态密码。

int code_time=20;   //安全代码刷新时间 
int code_len=6;     //安全代码长度 

string trim(string a,int len)
{
    string b;
    len=min(len,(int)a.length());
    for(int i=0;i<len;i++)
    {
        b+=a[i];
    }
    return b;
}

string generate(tm *t,int len)
{
    int year=t->tm_year+1900;
    int mon=t->tm_mon+1;
    int day=t->tm_mday;
    int hour=t->tm_hour;
    int min=t->tm_min;
    int sec=t->tm_sec;

    unsigned int result=(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*min*min*min*year*year*mon*mon*day*day+day*day*(sec/code_time+1)*(sec/code_time+1)*(hour+1)*(hour+1)*(min+1)-min;
    int a=result%2147480000+100000;

    char str[55];
    itoa(a,str,10);//将数字转换成字符数组存储到str中
    return trim(str,len);
}

trim(string)函数用于剪切字符串,提取字符串的前6位。

generate(tm,int)函数提供了一个非常暴力的算法,当然你也可以更换其中的算法,使得它随机性更高。

主循环

如果你想在程序启动的时候一直动态获取密码,并且显示还剩多长时间改变,那么你可以参照以下的代码:

    while(true)
    {
        tt=time(NULL);
        t=localtime(&tt);
        int time_remain=code_time-(t->tm_sec)%code_time-1;
        if(time_remain==code_time-1||!out)
        {
            out=true;
            system("cls");
            cout<<"Current security code : "<<generate(t,6)<<endl;
            cout<<"Code change : "<<time_remain;
            Sleep(100);
        }
        else
        {
            cout<<"                                \rCode change : "<<time_remain;
        }
        Sleep(100);
    }

像这样。每隔100毫秒读取一次系统时间,如果系统察觉到了密码应该变化,那么就重新计算一组密码。

完整源代码

在这里放出程序的完整源代码,方便进行学习、交流。

如果有更好的建议或者我讲的东西有任何问题,欢迎私信我,谢谢!

#include<iostream>
#include<ctime>
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#include<conio.h>
using namespace std;

int code_time=20;   //安全代码刷新时间 
int code_len=6;     //安全代码长度 
string password="123456";//保护密码 

string input()
{
    char geted=getch();
    string outed;
    while(geted!=13)
    {
        cout<<"*";
        outed+=geted;
        geted=getch();
    }
    cout<<endl;
    return outed;
}

string trim(string a,int len)
{
    string b;
    len=min(len,(int)a.length());
    for(int i=0;i<len;i++)
    {
        b+=a[i];
    }
    return b;
}

string generate(tm *t,int len)
{
    int year=t->tm_year+1900;
    int mon=t->tm_mon+1;
    int day=t->tm_mday;
    int hour=t->tm_hour;
    int min=t->tm_min;
    int sec=t->tm_sec;

    unsigned int result=(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*(sec/code_time+1)*min*min*min*year*year*mon*mon*day*day+day*day*(sec/code_time+1)*(sec/code_time+1)*(hour+1)*(hour+1)*(min+1)-min;
    int a=result%2147480000+100000;

    char str[55];
    itoa(a,str,10);
    return trim(str,len);
}

int main()
{
    time_t tt=time(NULL);
    tm *t=localtime(&tt);
    bool out=false;

    cout<<"Current security code : UNKNOWN"<<endl;
    cout<<"Code change : UNKNOWN"<<endl;

    string check;
    int timesss=1;
    for(timesss=1;timesss<=3;timesss++)
    {
        cout<<"Security pass required : ";
        check=input();
        if(check==password) break;
        else cout<<"[ERROR]Invalid pass! Chances remained : "<<3-timesss<<endl;
    }
    if(timesss>3)
    {
        cout<<"[DENIED]SECURITY PASS FAILED!"<<endl;
        getch();
        return 0;
    }

    while(true)
    {
        tt=time(NULL);
        t=localtime(&tt);
        int time_remain=code_time-(t->tm_sec)%code_time-1;
        if(time_remain==code_time-1||!out)
        {
            out=true;
            system("cls");
            cout<<"Current security code : "<<generate(t,6)<<endl;
            cout<<"Code change : "<<time_remain;
            Sleep(100);
        }
        else
        {
            cout<<"                                \rCode change : "<<time_remain;
        }
        Sleep(100);
    }
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢? 这篇文章利用了 HttpWebRequest 和 HttpWebResponse 模拟登录了有验证码的网站。 ...
  • huangtao2011
  • huangtao2011
  • 2015-05-11 23:24
  • 1974

用python写的模拟系统登录三次验证简单程序

实现模拟系统登录三次验证,初始状态时,系统对合法用户登录三次以内输入验证信息正确可正常登录, 如果合法用户登录超过三次,合法用户将被锁定,以后无法登录,需要管理员修改配置信息方可后续登录操作, 非法用...
  • www_xue_xi
  • www_xue_xi
  • 2016-11-22 17:16
  • 1256

C#调用Web Service时的身份验证

在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService?从哪里引用我的WebService?对于第一个问题,就涉...
  • xiaogui340
  • xiaogui340
  • 2013-04-09 09:21
  • 13977

PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)

本文章编写的原因,是由于zlib无法解压缩由ICSharpCode.SharpZipLib.dll压缩的文件对作者的项目造成了困难,于是结合网上关于这方面的资料整理了这篇文章,希望对大家有所帮助,减少...
  • kennyzjk
  • kennyzjk
  • 2015-05-16 17:50
  • 1014

用MD5算法模拟UKey上的动态密码生成

  • 2011-12-31 16:07
  • 1.90MB
  • 下载

【动态规划】[NOIP 模拟赛]密码

题目描述:假发通过了不懈的努力,得到了将军家门锁的密码(一串小写英文字母)。但是假发被 十四和猩猩他们盯上了,所以假发需要把密码传递出去。因为假发不想十四他们发现几松门 前贴的小纸条就是将军家的密码,...
  • JeremyGJY
  • JeremyGJY
  • 2015-10-22 13:13
  • 757

使用google身份验证器实现动态密码验证java demo

  • 2017-08-14 14:26
  • 5KB
  • 下载

程序设计C,C++哥德巴赫猜想,食物链,狼群战术,列车长的烦恼,最小生成树,凯撒密码,远古文明的算术,非前缀码,动态生成最小二叉排序树,小明数学题,成对字符串,唯一生成最小二叉树

  • 2010-01-01 11:40
  • 171KB
  • 下载

动态分区内存分配模拟C++

  • 2010-11-06 12:55
  • 32KB
  • 下载

操作系统内存动态分配C++模拟代码

  • 2013-12-08 14:26
  • 3KB
  • 下载
    个人资料
    • 访问:4443次
    • 积分:156
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档