手机点阵图案和数字锁屏强度对比
手机锁屏,常用有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个点。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )