最近买了一个销量很高的指纹锁装上了(牌子就不说了), 说实话各种体验都挺好。很人性化。很赞,我都想买个蓝牙网关把它的功能都玩一玩。
但是,(对,凡事就怕但是)
其中有个功能,只要你输入密码包含真实密码就能开门,是的这个是用来混淆旁观者的。
例如,你真实密码 123456,你可以输入 1234512333333331111111112345666666666 就能解锁。
对于此,我陷入了人生的大思考,
难道内部程序是吧密码直接明文存储在内存中? 匹配的时候直接
if (INPUTSTRING.contains(realPsw){
openTheDoor ()
}
-- 这样不是可能存在漏洞让人通过内存嗅探到密码,当然单人单户可能不值得这么去破解,如果破解这一个型号的锁,应该也是有人做的吧。
如果他是加密存储的密码,如果那么验证也太飞快了吧,每个不定长子串都加密或者 Hash 匹配一次,也是很大的次数吧。(应该超过多项式复杂度了吧)
我目前知道的,防止人暴力枚举的方法是PBKDF2, 让每次尝试的时间成本很大,(当然对嵌入式设备,尤其是没插电的,可能有更省电的方式)而不是简单的程序判断错误次数超过阈值就休眠,因为这个内存中这个次数对于金手指来说是可编辑的。
我当然知道这只是一个 1000 块的东西,可是安全问题,多考虑一下也没什么问题。
由于本人所知有限,有错误的话,希望大家指正,谢谢。
1
lvybupt 2021-06-04 22:39:23 +08:00 1
不用嗅探内存,一把锤子就能破。
这个锁的木桶短板是你的机械钥匙,不是电子元器件 |
2
shoaly 2021-06-04 22:43:42 +08:00 23
真的要较真的话 我说一个算法, 每次按下一个键之后, 就倒着取回去 6 位数, 然后就可以做 hash 去对比 "并不是明文储存的" 密码了. 所以也可以不是明文储存的密码
|
3
janxin 2021-06-04 22:45:38 +08:00
是明文的,要不然没法实现虚位密码功能
为什么是嗅探,从盗窃这种普遍操作而言,做这么复杂的工作门早就能打开了...毕竟撬门也没那么慢,尤其是对专业的人来说。嗅探抓用户输入自然可以,不过从某些程度上而言也是脱裤子放屁一样的操作,因为一般情况下意味着你需要打开门锁面板。 当然你是一个执行秘密任务的特工的话这事就另外讲了... |
4
loading 2021-06-04 23:02:19 +08:00 via Android
当你能读存储的时候,你都能挂恶意代码了,如果你认为需要挂安全芯片,客户买单吗?
反正这个作为卖点我不买单,还不如你把机械锁芯做好一点。 |
5
yanqiyu 2021-06-04 23:13:32 +08:00
既然你都能直接接触芯片内存了,直接开锁就行了为什么要绕这个弯子。
当然如果记录了 /指定了密码位数的情况下滑动窗口就能解决问题 对于没有记录密码位数的情况下,如果密码位数是某个特定的范围的(总不能允许用户设置任意长密码),问题退化成多项式时间。以及不能允许虚位密码任意长(不然和允许暴力破解无异),那么也就有一个耗时上限,我猜也不是不能接受。 |
6
liuidetmks OP |
7
tankb52 2021-06-04 23:20:45 +08:00
因为密码被泄露,多数来源于偷窥,极少数才来自于读取芯片内存吧?
|
8
Andrue 2021-06-04 23:53:56 +08:00
目前的技术里电子锁下面那个机械锁才是重点,和联网大规模攻击比起来直接短路开机械锁是最容易的
|
9
Tink 2021-06-05 00:17:48 +08:00 via Android
一定是明文的,不用多想
|
10
ysc3839 2021-06-05 00:47:47 +08:00 2
顺带一提,现在已经推荐使用 Argon2 而不是 PBKDF2 了。
|
11
Orciorc 2021-06-05 00:56:35 +08:00 via Android
题外话,始终不愿意使用指纹锁的最重要原因,是因为密码不可更换
|
12
admin7785 2021-06-05 01:05:30 +08:00 via iPhone
同感,目前住自如,输密码开锁时,也感觉是 contains() 校验的
|
13
FS1P7dJz 2021-06-05 01:10:06 +08:00
因为防范重点并不是这里
防御重点第一点就是物理锁体部分达到标准,你这么惊讶我能告诉你,所谓的 ABC 级锁,所谓的技术开锁 10 分钟以上,在实际上中都是 1 分钟攻破,你会不会更惊讶,但这就是事实,几百块到几千块在开锁匠眼里都是 1 分钟完事,根本不需要涉及电子部分 然后电子部分,主要漏洞依然是蓝牙 /wifi,和权限接入 这部分应该就是 V2 大家熟悉的了,某米号称自有加密技术也是这部分在采用,除去蓝牙 /wifi 协议底层漏洞,可以直接通讯,还存在权限这一部分的需要破解,到了这一步,你密码明文与否其实并不重要,因为最终控制电机转动即可开锁,理论上你能制造一个强大的磁场带动电机旋转也可以 其实最终还是成本和安全问题 当然可以设计一个并不采用通用设计的物理锁,甚至一锁一设计,出品后设计图销毁,让锁匠开锁的时候非常折腾 也可以设计一个完全防御各类电磁频闭,内部采用航天级别双备份双系统,设置对外协议也另起炉灶编写,所有通信交流需要专有设备 键盘指纹虹膜声音啥都弄上,一个不匹配自动炸毁焊死锁芯 可以,但是没必要 |
14
EscYezi 2021-06-05 01:12:42 +08:00 via iPhone
原来是这个功能吗🌚我一直以为是按#退格并且每次输错都按好几下#🌚
说起来楼下单元门一个电打火就可以开,其实就是楼上说的短路直接开机械锁? |
15
SingeeKing 2021-06-05 01:24:57 +08:00 via iPhone
建议不要明文存储密码主要考虑的是数据库泄漏被用于撞库的情景,门锁密码这种只存在内存里不会上网,无法存在大规模攻击,所以并没有必要去刻意做加密
|
16
GuuJiang 2021-06-05 01:35:19 +08:00 1
这其实是一个非常有意思的问题,不知道真实的密码锁是怎么实现的,但是假如让我来设计一个密码锁的话,我会采用下面的方案
当设置密码时,将设置的密码编译为一个 AC 自动机(当然由于只有一个关键词,所以实际退化成了 KMP,不过也可以支持多密码),这样每按一个键时实际是在自动机中进行转移,当到达终结状态时就开门,这有个巨大的好处,无论前面输入的无效内容有多长,都不会带来时间和空间上的额外开销,理论上可以支持的无效内容长度没有上限 假设密码锁真的采用了这样的方案,那么确实可以认为是明文存储的,虽然没有直接地存储密码本身,但是获得了完整的自动机等价于获得了密码,不过对于密码锁这种必需要物理接触才能使用的系统来说,直接暴力破坏恐怕都比试图读取存储要容易得多,所以是否明文存储已经不是那么重要了 |
17
jinliming2 2021-06-05 01:53:39 +08:00
边信道(有的叫旁信道、侧信道)攻击了解一下
|
18
geniussoft 2021-06-05 02:01:58 +08:00
如果达到这种级别的攻击,摄像头、旁路触摸、劫持触摸芯片的引脚都是无法解决的,而且更容易实现。
|
19
levelworm 2021-06-05 02:15:20 +08:00
可以 dump 下来看看里头的东西。另外能不能防电击?据说很多电子锁在受到点击的时候会 reset,回到没有初始密码的情况,也就是可以打开了。
|
20
levelworm 2021-06-05 02:24:04 +08:00
我想了下是不是这样,就是用一个窗口啥的,一个个移过去,这样就算是密文,也应该可以解密吧。比如说密文 6 位,你输入 40 位,这样他每次检测 6 位,不知道可行否?
我知道有些车库的开关就是这样,只不过他是真的明文。 |
21
toaruScar 2021-06-05 04:01:38 +08:00 via iPhone 2
“窗口”的话就有德布鲁因序列的弱点了,显著降低的暴力破解的成本
|
23
kop1989 2021-06-05 07:29:45 +08:00 via iPhone
如果是我来设计,我一定会存明文。
1 、脱机存储 2 、没有盗取密码有意义的场景。(除非用户非正确使用) |
24
delectate 2021-06-05 08:52:46 +08:00
手持小米推拉式,猜想一下:
1 、明文存储; 2 、虚位密码,输入后有个明显的停顿才会解锁,而且有最大长度限制,大概是 50 个数字。这个期间可能是以 6 位为单位,从头到尾遍历了所有,然后看 hash 是否一致; 3 、也可能是每次输入之后,从后向前截取 6 位直接对比,但是不开锁只记录令牌,停止输入后等待 1s 再看有没有令牌,再开锁。 |
25
rekulas 2021-06-05 09:29:54 +08:00
这样的锁确实有安全风险,旁路嗅探对 aes 都存在一定威胁更别说明文了,虽然从性价比来说应该没人会去研究这个破解,但从安全角度来说不应该这样设计
|
26
oott123 2021-06-05 09:34:35 +08:00
首先字串是定长的
其次就六位数字,你再厉害的 hash 也没用,拿个手机 CPU 都能一秒钟之内就给你暴力算出来 |
27
no1xsyzy 2021-06-05 09:50:56 +08:00
|
28
toaruScar 2021-06-05 10:17:31 +08:00 via iPhone
@no1xsyzy #27 要绕过这个限制也简单,每次开始前把上次尝试的后几位也输进去就行了
6 位数字的德布鲁因序列有 10 万个数字左右,一秒输入 10 个数字,只要 10000 秒就可以了,不到三个小时 就算隔 5 秒要停 1 秒,效率也还算合理。 |
29
aureole999 2021-06-05 10:22:35 +08:00
rolling hash 了解一下。不过用没用在锁上就不知道了。
|
33
lysS 2021-06-05 11:11:06 +08:00 5
懂了,输 π 就行了
|
34
x86 2021-06-05 11:34:58 +08:00 via iPhone
锁匠:你讲的是咩啊?
|
35
zxcslove 2021-06-05 11:49:25 +08:00
电子锁必然要限制输入方式的,不然毫无意义。很多杂牌都是一把螺丝刀捅开,机械安全(相对)是第一位的。
|
36
Rheinmetal 2021-06-05 11:50:53 +08:00
@no1xsyzy 当然是嗅探接口重试了
|
37
mxT52CRuqR6o5 2021-06-05 11:52:42 +08:00 via Android
内部存储是不是明文并不是电子锁安全的瓶颈
服务器里存的密码都加盐 hash 是因为大多数的服务数据库都直接 /间接暴露在公网上 |
38
dangyuluo 2021-06-05 11:55:30 +08:00
单纯考虑下存储方式,可能是这样的,第一次输入密码的时候,存储密码的 md5 (或其他摘要方式)值和密码长度(记作 n )。当你输入一个 m 长的密码时,会从第 0 位开始匹配,每次匹配 n 个数字,直到第 m-n 为止。如果有匹配的就开锁。
|
39
dangyuluo 2021-06-05 11:55:58 +08:00
当然这个匹配过程也是进行 md5 (或其他摘要)
|
40
Stain5 2021-06-05 11:59:32 +08:00
明文 加密储存有意义吗
这种锁你有不可能设几十位密码,单纯的十位以内数字的数据 碰撞破解也就不到一天的事 就算不从密码下手,把你指纹的特征提取出来,进行离线测试 大约跑 300w 次就能筛选出一个碰撞模型来通过你的指纹锁 |
41
beijiaoff 2021-06-05 11:59:58 +08:00 1
每输入一位,就检查前面 6 位就行了呗。
你的举例中,最后几位 6 就不用管了,因为已经出现正确密码了,锁就认为你是主人了。 当然还要限定一下总位数,比如不能超过 50 、100 这种明显捣乱的。 |
42
liuidetmks OP @mxT52CRuqR6o5 蓝牙协议是一个弱点,这个锁能通过蓝牙网关联网的。可以通过蓝牙网关远程控制。也就是说用户的密码会通过 用户手机-> 厂商服务器->蓝牙网关->门锁,这其中最孱弱的估计是蓝牙这一块(主观感受,新闻里面经常说蓝牙 xxx 漏洞)
|
43
intellectual 2021-06-05 13:32:46 +08:00
基本上所有的锁都是防君子不防小人。。。
现在锁的目的其实就是为了不带钥匙,方便。。。 你去查一下技术文档,各种级别的锁有规定需要在啥时间可以用开锁器打开。很多 5000 块的锁,1 分钟就能打开的。醒醒吧。 |
44
yellowV2ex 2021-06-05 15:01:08 +08:00
我认为这不是 bug,是一个 Feature,为了就是你输错前几个字母的时候不用按取消不用等几秒重置,随时直接输入对的密码即可开门,就算多输入几位也可以。
|
45
ziseyinzi 2021-06-05 15:08:43 +08:00
你都说蓝牙网关了,不就相当于说是哪家了……
|
46
xcstream 2021-06-05 15:29:22 +08:00
这不是机械容易破解的问题,这是个算法问题。
验证的是最后 6 个数字,又不是所有历史输入(狗头),哪里来的多项式复杂度。 |
47
pcbl 2021-06-05 15:30:33 +08:00 via Android
楼上说暴击破解的是来搞笑的吗?连续错误会延迟输入的
|
48
shawnsh 2021-06-05 16:06:12 +08:00 via Android
不同厂家的电子锁实现应该不一样,什么情况都有
|
49
est 2021-06-05 18:01:49 +08:00
猜黑盒子水平,楼主不合格,2 楼满分!
用户输入数字 -> 回头检查 6 位是否为正确密码(管你明文还是 hash ) 如果检查正确,那么就是否开锁 -> true,等用户停止输入一段时间就执行电机开锁,完毕。 其实这也可以产生一个问题,如何输入最短的数字串,用来穷举完所有 6 位密码组合?(或者先把条件简化为 3 位密码) |
51
Valid 2021-06-05 18:26:38 +08:00
防君子不防小人的东西加不加密都不重要
|
52
namelosw 2021-06-05 19:04:39 +08:00
如果是不定长的话,的确不用明文存储很难做到。
定长的话就是最后 N 位,也就是 O(n),只是加密算法的常数都很大。 |
53
namelosw 2021-06-05 19:07:30 +08:00
|
54
dLvsYgJ8fiP8TGYU 2021-06-05 19:24:11 +08:00
就算电子部分的算法设计再巧妙,只要有失灵 /没电的可能,就需要留一个机械钥匙孔做备份,也就多了一个攻击面。机械锁芯抗技术开锁的能力如何?
有些电子锁还有 Wi-Fi/蓝牙(甚至未来不排除有厂家用物联网卡)这些通信模块,用来实现一些(高情商:物联网智能化;低情商:花里胡哨)的功能,又多了一个攻击面。 数字密码锁:别人涂一点特殊染料到你键盘上,观察哪些数字经常被按,再用排列组合是不是更快? 指纹锁:现在不会还有光学指纹吧?指纹膜了解一下?半导体 /电容指纹锁不知道能不能用这种方法攻破 卡片:用的是 IC 还是 ID ?不会还有扇区不加密的卡片锁吧?抗复制性能怎么样? 别人拿个大功率远程读取器从几米外读你身份证 /带闪付功能的银行卡 /护照的案例了解一下?有没有人体验过经过某种安检门后,手机的 Apple Pay 界面莫名其妙弹出的?是不是出门还得把你的卡片放在防 RFID 的卡套里面? 手机手表的 NFC 啥时候能用来开锁也是不错的 单一因素认证风险都不可忽略,最好选支持双因素认证的锁。门口装个摄像头也是不错的选择。 |
55
zx4824 2021-06-05 19:56:08 +08:00
呃,不懂技术细节就问,为什么要假设这种耸人听闻的呢?
首先设置的密码是有位数限制的,比如 4-16 位 那只需要分别记录 “最后输入的 4 位数” “最后输入的 5 位数” 。。。 “最后输入的 16 位数” 总共 13 个字符串,然后 hash 比对,其中有一个符合就可以了 这点 hash 量很轻松 哪家正规大厂会冒着损害商誉的风险,搞这种明文存储的低级失误。 |
56
zgzb 2021-06-05 20:11:25 +08:00
去重,取后六位
|
57
jiangzhizhou 2021-06-05 20:14:53 +08:00
老哥,锁都是防君子,防不了小人。
密码锁仅仅只是为了让你别带钥匙而已。 在 CN 警察敲门你敢不开门么? 真的要开门,早就砸了 |
58
janxin 2021-06-05 21:16:13 +08:00
很多人想当然了,就没考虑过在中间和最开头的情况么...为什么假设正确密码一定就在最后...
|
59
beijiaoff 2021-06-05 22:44:13 +08:00
@janxin 在中间也没啥问题呀。只要检测到连续 6 个是对的,就判定是主人了。后面就不用检测了。等输入停顿后执行开锁即可
|
60
LithiumLee 2021-06-05 23:53:19 +08:00
明显是明文密码,只要处理物理密码和处理网络部分分开就行,你从网络上也无法获取他真实密码就可以了
毕竟你都把锁拆开了读芯片了,你为啥不直接把门一起开了呢,开锁机构就一个电机而已,你给电机上电门就开了 这种智能门重点就是不要让人通过网络黑进来开了就行 |
61
LithiumLee 2021-06-05 23:55:08 +08:00
想安全还是在门里面装个触发机构,自动报警比较安全
|
64
msg7086 2021-06-06 15:03:16 +08:00
@agostop #50
> 如果真的只是存的 hash,你怎么知道是 6 位的密码? 密码的长度是个数字,其实是可以存的。你可以把 6 存在存储器里,不贵。 @liuidetmks #6 你用软件可以每秒输入几百万个数字来离线穷举,所以才需要重复 hash 。 但是密码锁,就算你单身 30 年的左手也未必能一秒按十次。 就算是要防止电信号直接连接暴力破解,锁内部直接 sleep 一下就好了,没必要反复计算。 反复计算抗爆破的前提是你需要防止别人拿到 hash 以后在另一台电脑上爆破。 但是通常不会有人破解门锁的时候去读门锁内部的 hash 。 毕竟你都能读到门锁内部的数据了,为什么不把锁直接拆了。 |
65
msg7086 2021-06-06 15:08:15 +08:00 1
另外推荐看看撬锁律师的视频,可能会让你对锁有更深的了解。
https://www.youtube.com/c/lockpickinglawyer/videos?view=0&sort=p&flow=grid |
66
julyclyde 2021-06-07 10:57:22 +08:00
其实和网络身份验证的“PIN+TOKEN”类似,这部分是明文的
网络一般依赖于更底层的加密传输 门锁依赖于前后部的连线不外露 |
67
morningtzh 2021-06-07 12:48:02 +08:00
鹿客 6 位密码,16 位虚密码。无脑 hash 16 次搞定
|
68
leafin 2021-06-07 22:45:32 +08:00
我没用过,但我猜密码是定长的,或者保存密码的同时保存 hash 和密码长度。
假设密码长度是 6,输入长度是 10,验证时从前往后每次截取相邻的 6 个字符进行 hash 比较,只需要比较 10-6+1=5 次就行了。 |