手机点阵图案和数字锁屏强度对比

手机点阵图案和数字锁屏强度对比

手机锁屏,常用有3*3点阵图案锁屏和数字锁屏,这里做下相同长度下它们的安全强度分析。

一、图案锁屏

图案锁屏的要求,长度大于等于4,且每点不能重复,而且不能跨点连线。如果将九个点分别定义为如下

手机锁屏

(上面点阵锁屏L型图案,字符串化为“14789”)

将点阵图转好为普通数字串,则其规则如下

1) 长度在 4-9之间的“1 – 9” 数字串,也就是长度大于或者等于4,小于或者等于9 ;
2)每个数字不能重复,也就是最多只能出现一次;
3)同一直线上的数字,中间不能跳过一个点,除非该点之前被选中过。比如 “1”和“3” 连线,不能直接跳过“2”,除非“2” 之前被选中过。也就是如果出现“13”,一定会选中“2”,且“2”要求在“13”之前。如“2134” 是合法的,而“1324”(“2”在“13”之后)则是非法的。非角上的点,都可能在一条直线之间,找出这些规则要求的组合有:

    ('2', '13'), ('2', '31'), ('4', '17'), ('4', '71'), 
    ('6', '39'), ('6', '93'), ('8', '79'), ('8', '97'),
    ('5', '19'), ('5', '91'), ('5', '28'), ('5', '82'), 
    ('5', '37'), ('5', '73'), ('5', '46'), ('5', '64')

对于选择1-9 的长度在为len的不重复选择数字的字符串,也就是排列组合的内容,python 实现可以用permutations(‘123456789’, len) ,把len 限定在4-9 枚举生产字符串,那么就可以满足 上面1)、2)要求的字符串了。

对于3),转化为函数,如下的 is_llegal_string:

regulation = [
    ('2', '13'), ('2', '31'), ('4', '17'), ('4', '71'), 
    ('6', '39'), ('6', '93'), ('8', '79'), ('8', '97'),
    ('5', '19'), ('5', '91'), ('5', '28'), ('5', '82'), 
    ('5', '37'), ('5', '73'), ('5', '46'), ('5', '64')]


def is_llegal_string(s):
    for s1, s2 in regulation:
        if s2 in s and s1 not in s[:s.find(s2)]:
            # s2 在s 内,也就是存在跨点连线的情况,
            # s1 not in s[:s.find(s2)],也就是中间点没有在之前被选中 
            return False

    return True

二、普通数字锁屏

上面所说为点阵图转换为的字符串。如果手机直接用数字串(这个和前面点阵转弯的字符串不一样)来作为锁屏密码,那么对于4为长度的密码有:0000,0001,0002……9999 共10000(也就是10^4) 种情况,其他的位数n 分别为10^n 种情况。

三、编写程序对比分析

写个程序做下对比,比较点阵图和普通数字锁屏,在相同长度下的密码空间大小情况。使用python 实现(完整)代码如下:

#-*- coding: UTF-8 -*-

from itertools import *

regulation = [
    ('2', '13'), ('2', '31'), ('4', '17'), ('4', '71'), 
    ('6', '39'), ('6', '93'), ('8', '79'), ('8', '97'),
    ('5', '19'), ('5', '91'), ('5', '28'), ('5', '82'), 
    ('5', '37'), ('5', '73'), ('5', '46'), ('5', '64')]


def is_llegal_string(s):
    for s1, s2 in regulation:
        if s2 in s and s1 not in s[:s.find(s2)]:
            return False

    return True


if __name__ == "__main__":

    image_total = 0
    number_total = 0

    for i in range(4,10):
        perm = permutations('123456789', i)

        legal_count = 0

        for t in perm:
            s = ''.join(t)
            if is_llegal_string(s):
                legal_count = legal_count + 1

        image_total = image_total + legal_count
        number_legal_count = 10 ** i
        number_total = number_total + number_legal_count;
        
        print("长度:" + str(i) + ",点阵有效个数:" + str(legal_count) + ", 数字有效个数:" + str(number_legal_count) + ",比率" + str(legal_count / number_legal_count))

    print("点阵总有效个数:" + str(image_total) + ", 数字有效个数:" + str(number_total) + ",总比率:" + str(image_total / number_total))

运行结果如下:

可以看到,点阵图案密码远没有数字密码空间大,四个点的点阵图像个数为1624,而数字密码则有10000个,这两个数字也就是长度4的时候需要枚举的最多次数,数字密码空间大小为图像的约6倍。位数越高,数字密码比图像密码的比例就越大了,也即是数字密码比图像密码更为安全(在都不考虑常用密码或者常用图案的情况下)。

四、总结

数字密码长度为4,图像密码至少需要6个点才能有相同的密码强度;而数字密码长度为5时候,图像密码,就需要只是8个点才有相同的强度了,如果数字密码长度为6,强度比图像密码的最大长度9更为强了。

五、题外话

下图为人们常用的手机点阵锁屏的图案(https://motherboard.vice.com/en_us/article/kzyd4m/researchers-used-sonar-signal-from-a-smartphone-speaker-to-steal-unlock-passwords), 20%的人群使用下图的一种。

手机锁屏,常用图形

上图也可以看到,大多数人的选点都不会选到全部点的,一般都是4 – 6个点。

(全文完)

原文链接:http://blog.yuccn.net/archives/671.html

(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn

发表评论

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