乐读窝

程序员的数学思维修炼

乐读窝 > 科普学习 > 程序员的数学思维修炼

4.6密码的长度

书籍名:《程序员的数学思维修炼》    作者:周颖



对于可重复排列,在日常生活应用中一个有趣的话题就是密码长度的问题:什么样的密码是安全的?增加密码的长度?还是增加密码可用字符数?



4.6.1 容易破解的密码


在日常生活中,我们的银行账号要设置密码、邮箱要设置密码、使用手机客服需要密码等。总之,现在是一个充满密码的时代。

首先,我们来看容易破解的密码。

想象一下,我们打开保险柜的密码如果设置为这种情况:一个单刀双掷开关,如图4-19所示。有两种状态,向左边接通或向右边接通。

图4-19

这种保险柜能保险吗?我们只需要向左接通试一下,若不能打开,再向右接通。只有两种状态,并且只有一个开关,则其排列数为2。因此,最多只需要试两次就可进行破解。

现实中当然没有这么简单的密码情况。例如,我们到银行取款时需要输入密码,现在银行柜台和ATM柜员机中使用的密码只能为数字。如果密码只设置为1位数字,则0~9这10个数字用1位数可得的排列数为:

即,如果密码设置为1位数字,只有10种可能。显然,这种密码就很不安全,很容易被破解。最多连续重试10次就可枚举完所有密码。

为了增强密码的安全性,可以从两个角度来考虑:一是增加密码的长度,这样,就使可用密码的数量呈几何级数增长,增加被其他人通过枚举方法进行破解的难度。第二种方法是增加可选择的字符,同样可增加可用密码的数量。

目前,我国银行使用的ATM只能输入数字,因此增加可选择字符这个方案行不通,就只有通过增加密码长度来保证密码的安全了。现在银行密码的最大长度为6,因此,可使用密码的数量为:

即,如果破解者在最坏的情况下,可能需要枚举100万次,才能知道某银行账户的密码。由于在ATM柜员机上只能手工输入密码,且一天之内如果密码输入错误3次,该账号将被锁住,这样就增加了银行账号的安全性。因此,6位的数字密码具有一定的安全性。

当然,破解者通常不会仅通过枚举方法来枚举所有可能的密码,一般还会根据账号所有者的个人信息进行破解。所以,我们在设置银行账号密码时应尽量不用自己的个人信息(如生日、身份证号中的一部分等),以防被有心人快速破解。



4.6.2 多长的密码才安全


由前面的分析可看出,银行ATM的密码为6位数字,有100万种可能。由于银行采用了一些限制条件,可保证账号的安全性。

可是,如果这种6位数字密码用在计算机中,就显得不足了,太容易被别人破解了。

例如,对于登录邮箱时输入的密码,如果只设置为6位数字,则破解者可通过计算机的快速运行能力,编写程序,在很短的时间内就可将100万种密码逐一测试,找出正确的密码。这样,邮箱账号的密码就没有安全性可言了。

根据前面的分析,可以增加密码的长度,以增强密码的安全性。那么,多长的密码才安全呢?

密码被破解的可能性不仅与密码的长度相关,与计算机的发展也相关。对于相同长度的密码,计算机的速度越快,被破解的可能性就越大。

例如,很多论坛注册账号时都要求密码的长度要大于8,与6位数的密码相比(如果只是使用数字0~9作为密码),可用密码数量会增加100倍:

因此,我们在计算机中设置密码时,应尽量使密码设置得更长,以增加密码被破解的难度。



4.6.3 密码中使用的字符数量也很关键


要增加密码被破解的难度,就需要增加可用密码的数量。

前面说的增加密码的长度,只是增加计算可重复排列数中的指数m的值,也可考虑增加基数n的值,这样也可增加可用密码数量。

从表4-1中可看到,从ASCII码值为32开始至126,一共有95个可由键盘直接输入的字符,若这些字符都可用来设置密码,则6位长度密码的可重复排列数可达到:

破解者若想枚举完这7350多亿个密码,按目前计算机的速度,每秒钟大概能测试验证几百个密码,则要想将这7350多亿个密码枚举完成,24小时开机都需要20多年的时间才能完成。

如果将密码长度设置得更长,如设置为8位,则可重复排列数可达到:

这是一个天文数字,与使用6位长度的密码相比,可重复排列数增加了9000多倍,同样,其破解难度也就增加了9000多倍。

当然,以上我们计算的都只是理论上的值。一般情况下,系统为了使密码达到一定的安全性,都要求密码中必须包含数字、字母和特殊符号,并要求密码必须达到一定的长度。可是,很多用户为了方便自己记忆,在设置密码时可能只使用数字,或只使用字母,并且设置的长度往往也只达到系统要求的最底长度。这样,就导致自己的密码不安全。

因此,作为程序员,我们在系统中应对用户设置的密码进行检查,包括检查密码的长度、检查密码中包含的字符种类(至少应该要求用户使用两类字符)。作为用户,我们在设置自己账号的密码时,无论系统是否对密码的字符、长度有要求,我们都应设置足够的密码长度,并尽量使用数字、字母和特殊符号的组合来设置密码。这样,可使自己的密码更具有安全性。