个人写的测试密码强度的方法

    前两天在博客里看到有位老兄用jsp写了个测试密码强度的脚本,但是我觉得没必要像他脚本里写得那么麻烦,在加上我一时手痒(这个也许是主要原因:P),所以就禁不住用C也写了个测试密码强度的程序。

    在开始讲我的方法之前,先看看几个弱密码。第一个:123456,这个恐怕是最白痴的密码了,呵呵。第二个:19830321,很明显这是用生日来做密码。第三个:abcdefgh ,不多说了,也是个弱密码。第四个:johnabruzz(《越狱》里面那个黑帮老大的名字),这是用人名来做密码。原则上这样的密码本身的强度其实并不弱,但是对于跟你关系很亲近的人,那就不一定了。

    不知大家看出些什么规律来没有,我就不卖官子了。前三个密码中,每个字符与其前后两个字符是相临的。而这正好是破解软件和破解者最喜欢的,简单啊,估计现在没人用这样的密码了。但是这却给了我一个提示,在散列算法中有一个计算散列地址的方法,它使散列空间中的记录能够平均分布,从而降低散列冲突的概率。如果我们用这种方法,把密码中每个字符的ASCII码值一次存放到一个数组里,然后计算相临元素的差值(第一个元素和最后一个元素做差)的绝对值。第一个元素和最后一个元素的差值用密码的长度减1来使其平均化,因为如果第一个元素和最后一个元素的差值过大,就会影响估计结果。最后,将这些差值求和并求平均值。

    求完平均值后,还没完,我们得看看密码长度。如果密码的长度小于6,那么该密码就是个弱密码,不管它的平均值有多大。因为密码长度小于等于6的话,计算机可尝试的密码组合就是ASCII码的字符个数(标准的是128个)的6次幂约4398亿个组合。别看4398亿这个数字对于你来说很大,但是现在的机器,运行速度那都是钢钢的(包括赛扬),如果破解程序再用上优化算法,最多几分钟就给你破解出来。后果我就不说了。

    好了让我们用上面的方法来试试,假设弱密码的均值范围是[0,5],中等强度密码的均值范围是(5,10],强密码的均值范围是(10,+∞]。我们先看第一个弱密码:123456,他们的ASCII是相临的,于是他们的差值的平均值/强度值就是1,非常地弱。第二个密码:19830321,它的强度值是3,也很弱,可见用生日做密码一点也不好。第三个密码:abcdefgh,和第一个密码一样,强度值是1,啥也不说了,唉。那么我们换个强壮一点的密码试试,就试试我的英文名字John Adams吧,它的强度值是7,看来用人名做密码也不是多好。那么用这个变态的密码 fhgBD^*Jk*( 试试,强度值是23,不愧是变态密码,嘿嘿。

    当然这样的方法还并不完美,因为它不会判断密码是不是生日、人名等信息。我们可以用正则表达式先对密码进行一下判断然后再做进一步的计算。还有就是没有提供unicode字符的支持,但是我想这应该不难改进,就算是留了个小作业吧:P。总之,看似复杂的问题,其实可以简单化的,呵呵。

    最后,附上我用VC写得测试代码,是个控制台程序,因为本人还不是太会做GUI界面的程序,呵呵。因为本人比较懒惰,就限制了一下密码的长度为20位。代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. int GetRobustnessValue(const char* s)
  6. {
  7.     int  len;  //Length of the input password
  8.     int  Robustness; //Local variable used to store password Robustness
  9.     Robustness = 0;
  10.     len = strlen(s);
  11.     int i;
  12.     int j = len - 1;
  13.     for(i = 0; i < j; i++)
  14.     {
  15.         Robustness += abs((short)s[i%len] - (short)s[(i+1)%len]);
  16.     }
  17.     Robustness += abs(((short)s[len] - (short)s[0])/(len -1));
  18.     return Robustness/len;
  19. }
  20. void main(int argc, char *argv)
  21. {
  22.     int Robustness;
  23.     char c[21];
  24.     short len;
  25.     do{
  26.         printf("/n/n");
  27.         printf("please type in the test password, type /"exit/" to exit/n");
  28.         printf("(max length is 20):");
  29.         scanf("%s", &c); //get the password string
  30.         len = strlen(c); //get the length of the password
  31.         if(len > 20)  //length out of the range, so the password
  32.         {     //is invalid
  33.   
  34.             printf("Invalid pasword");
  35.             scanf("%d", &Robustness);
  36.             exit(1);
  37.         }
  38.         if(len < 7)   //If the length is less of 6, then the
  39.         {     //password is definitely weak
  40.             printf("Week password cos it's length is short of 6");
  41.         }
  42.         strongth = GetRobustnessValue(c); //Get password strongth value
  43.                                           //note: the array c passed to
  44.                                           //      function GetRobustnessValue
  45.                                           //      will degradated to a pointer
  46.         printf("/n");
  47.         printf("The password Robustness is:%d/n", Robustness);
  48.         if((0 <= Robustness) &&(Robustness <= 5))
  49.             printf("Very weak password!");
  50.         if((5 < Robustness) && (Robustness <= 10))
  51.             printf("The Robustness is still need to be improved!");
  52.         if(Robustness >10)
  53.             printf("It's a Robust enough password");
  54.     }while(strcmp(c, "exit")); //If the user type in "exit", then
  55.                                //terminate the tester
  56.                                //end of while
  57. }

    后记:这篇文章是老早之前写的,本来想用来当毕业论文的,但是感觉太简单拿不出手,就自己收藏了。:P
    在此,再附上自己对这个算法的时间复杂性分析(大牛请略过:P)。设密码字符串的长度为N,则取第i个字符和第i+1个字符,计算字符ascii码差值并转换为绝对值,将差值累加三个操作各需要O(1)的时间,而这样的操作需要进行N次(因为最后还要计算字符串最后一个字符跟第一个字符的差值),所以总共耗费的时间为N*4*O(1) = O(N),可见为线性时间。当然,当时程序中没有考虑数组c越界的问题,确实是一个bug。不过,明天我会将图形界面的程序写出来,算是这个程序的升级版吧。

 

2008-1-14 0:05

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NAND闪存的读速度可以通过以下几种测试方法进行评估: 1. 顺序读测试:这种测试方法使用连续的数据块进行读操作,以测试NAND闪存的最大读速度。测试程序会向NAND闪存中入一些数据,然后立即读取这些数据。测试结果会显示出闪存的读速度。 2. 随机读测试:这种测试方法使用随机的数据块进行读操作,以测试NAND闪存的随机读速度。测试程序会随机选择一个数据块并进行读操作,然后再选择另一个数据块进行读操作。测试结果会显示出闪存的随机读速度。 3. 多线程读测试:这种测试方法使用多个线程同时进行读操作,以测试NAND闪存的多任务处理能力。测试程序会启动多个线程,每个线程负责不同的读操作。测试结果会显示出闪存的多线程读速度。 4. 大文件读测试:这种测试方法使用大文件进行读操作,以测试NAND闪存的读速度和稳定性。测试程序会向NAND闪存中入一个大文件,然后立即读取这个文件。测试结果会显示出闪存的读速度和稳定性。 以上测试方法可以通过专业的测试工具进行实现,如ATTO Disk Benchmark、CrystalDiskMark等。在进行测试之前,需要确保测试设备和测试程序设置正确,并选择合适的测试方法测试结果可以用于评估NAND闪存的读性能,以便选择性能更优的NAND闪存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值