前言
前段时间看到一篇文章,里面说现在房门上的数字密码锁有个有趣的机制:只要输入的字符串包含真正的密码,就能正常开锁。比如你的密码是 123456,输入 2581234565369,就能正常开锁。听起来感觉有点不对劲,但是某天我对着自己房门上的数字密码锁进行了测试,结果发现是真的。
但是这样的机制,似乎潜藏着安全隐患。毕竟,输入的字符串越长,其中包含正确密码的可能性理论上就越大,这岂不是意味着,攻击者即便不清楚正确密码,也能通过输入有限个最大长度的字符串来打开锁?
思路验证
带着这样的疑问,我开始进一步验证。我对自家房门的数字密码锁展开测试,确定其最大可输入数字长度为 20,输入完成后按 “#” 键确认。而通常来说,这类密码锁的密码长度为 6,且密码由 0 - 9 的数字组成。如此一来,问题就转化为:在每次输入 20 位长度字符串的情况下,最多需要输入多少次,才能遍历到正确的 6 位密码?
为了弄清楚这个问题,我向豆包进行了咨询,得到的结果如下:
看来数学上已经研究过这个(德布鲁因序列 (De Bruijn sequence) 问题)了,要输入 5w 多次才能遍历到正确密码,那其实还是比较安全的。感觉不如试试经典弱密码或者社会工程学来得快些。
总结
原本还担心密码锁这 “包含即开锁” 的机制会有安全漏洞,了解到得输入五万多次才能遍历所有可能的 6 位密码后,感觉还好,设计这个机制的产品经理们应该考量过这个安全问题了吧。反而显得我数学基础不太好,乐。