怎样评估密码的强度


我很受不了一些网站强制要求密码中必须包含数字和字母,甚至有一些网站变态地要求密码中必须包含数字、小写字母和大写字母。如果说这些网站是一些大型的涉及重要信息的网站,要求使用这样的密码倒还可以理解,但现在越来越多的小网站都要求在密码中包含数字和字母。正常情况下,在一些重要的网站,我当然会使用数字+字母的密码,同时,在一些小型网站上,我会使用通用的密码,特别是在一些临时注册的网站上,我会设置很简单的密码。令人厌烦的是,这些网站偏偏还要求在密码中包含数字和字母,这就给我记忆密码造成了很大的麻烦:本来我在这些小网站上的密码都是很简单的很便于记忆的,这时候突然冒出一个要求使用数字和字母的网站,于是我就不得不思考一个包含数字和字母的仅用于小型网站的密码。日后,当我想重新登录这些网站的时,我根本想不起来我用的是什么密码,是简单的纯数字密码呢?还是数字+字母的密码呢?

以上只是抱怨而已,有感于现在很多所谓的产品经理完全不懂技术而又企图在技术上指手画脚而发。如果产品经理只是指手画脚也就罢了,当技术人员给他们解释其中的原因之后,他们却依然固执地坚持错误的认识。这还真是应了那句话:会写程序的去做程序员了,会画画的去做美术了,我什么都不会,只能去做产品经理了。

抱怨完毕,下面开始正题。那么我们应该如何判断一个密码的强度呢?

首先考虑一个问题,数字+字母的密码比纯数字的密码更安全吗?套用一句话:抛开密码长度谈安全性都是耍流氓。

显然,一个 8 位的纯数字密码和一个 8 位的数字+字母的密码,自然是后者更为安全。那么,一个 15 位的纯数字密码和一个 8 位的数字+小写字母的密码,哪个更安全呢?

也许有人会认为 8 位的数字+小写字母的密码更安全,那么让我们计算一下这两种密码组合分别能够产生多少种密码。

15 位纯数字密码组合数: \( 10^{15} = 1.0 \times 10^{15} \)

8 位数字+小写字母组合数: \( (10 + 26)^{8} \approx 2.821 \times 10^{12} \)

结果 8 位纯数字+小写字母的密码的组合数竟然比 15 位纯数字密码少了 3 个数量级。

所以说,抛开密码长度谈安全性都是耍流氓。

于是在这里提出一种判断密码强度的方法。

首先定义所谓的密码强度,密码强度指的是,通过暴力破解手段破解密码时,破解成功平均所需的计算量。

密码可能的组合数显然和破解所需的计算量正相关,那么我们就可以使用密码可能的组合数来表示密码的强度。

当用户输入一个密码时,如何判断用户输入的密码的强度?我们可以这样计算:

当用户输入 \( N \) 位纯数字密码时,爆破这个密码可以只选取纯数字进行爆破,那么最多需要尝试的次数是 \( 10^{N} \)

当用户输入 \( N \) 位纯数字+小写字母密码时,爆破这个密码需要选取数字(10 个字符)和小写字母(26 个字符)进行尝试,最多需要的尝试次数是 \( (10 + 26)^{N} \)

同样地,当用户输入 \( N \) 位纯数字+大小写字母+符号(假设用户最常可能使用 10 个符号),那么爆破最多需要尝试的次数是 \( (10 + 26 + 26 + 10)^{N} \)

如果爆破所需要的最多尝试次数是 \( M \),那么密码强度 \( S \) 可以定义为:

\[ S = \log_{10}{M} \]

也就是取爆破所需的最多尝试次数的数量级作为密码强度。

这样我们就可以量化地判断密码强度了,回到最开始的那个问题,8 位数字+小写字母的密码和 15 位纯数字密码哪个强度更大?通过上面的公式可以算出,8 位数字+小写字母的强度是 \( \log_{10}{2.821^{12}} \approx 12.4 \),15 位纯数字密码的强度是 \( \log_{10}{10^{15}} = 15 \)。显然,后者强度更好。

在此也对一些大型网站表示不满,我一个十几位的纯数字密码比 8 位(这些网站要求的最小密码长度)的数字+小写字母密码更安全,你们为什么强制要求我抛弃我已经用惯了的更安全的 15 位纯数字密码,而去使用一个安全性更差的 8 位数字+小写字母密码呢?

本文发表于 技术向,并添加了 , , 标记。保存永久链接到书签。

发表评论

邮箱地址不会被公开。