V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuidetmks
V2EX  ›  信息安全

由一个电子指纹锁想到的,难道指纹锁内部存储密码都是明文?

  •  
  •   liuidetmks · 2021-06-04 22:34:45 +08:00 · 7496 次点击
    这是一个创建于 1302 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近买了一个销量很高的指纹锁装上了(牌子就不说了), 说实话各种体验都挺好。很人性化。很赞,我都想买个蓝牙网关把它的功能都玩一玩。

    但是,(对,凡事就怕但是)
    其中有个功能,只要你输入密码包含真实密码就能开门,是的这个是用来混淆旁观者的。
    例如,你真实密码 123456,你可以输入 1234512333333331111111112345666666666 就能解锁。
    对于此,我陷入了人生的大思考,
    难道内部程序是吧密码直接明文存储在内存中? 匹配的时候直接

    if (INPUTSTRING.contains(realPsw){
       openTheDoor ()
    }
    

    -- 这样不是可能存在漏洞让人通过内存嗅探到密码,当然单人单户可能不值得这么去破解,如果破解这一个型号的锁,应该也是有人做的吧。

    如果他是加密存储的密码,如果那么验证也太飞快了吧,每个不定长子串都加密或者 Hash 匹配一次,也是很大的次数吧。(应该超过多项式复杂度了吧)

    我目前知道的,防止人暴力枚举的方法是PBKDF2, 让每次尝试的时间成本很大,(当然对嵌入式设备,尤其是没插电的,可能有更省电的方式)而不是简单的程序判断错误次数超过阈值就休眠,因为这个内存中这个次数对于金手指来说是可编辑的。


    我当然知道这只是一个 1000 块的东西,可是安全问题,多考虑一下也没什么问题。

    由于本人所知有限,有错误的话,希望大家指正,谢谢。

    68 条回复    2021-06-07 22:45:32 +08:00
    lvybupt
        1
    lvybupt  
       2021-06-04 22:39:23 +08:00   ❤️ 1
    不用嗅探内存,一把锤子就能破。

    这个锁的木桶短板是你的机械钥匙,不是电子元器件
    shoaly
        2
    shoaly  
       2021-06-04 22:43:42 +08:00   ❤️ 23
    真的要较真的话 我说一个算法, 每次按下一个键之后, 就倒着取回去 6 位数, 然后就可以做 hash 去对比 "并不是明文储存的" 密码了. 所以也可以不是明文储存的密码
    janxin
        3
    janxin  
       2021-06-04 22:45:38 +08:00
    是明文的,要不然没法实现虚位密码功能

    为什么是嗅探,从盗窃这种普遍操作而言,做这么复杂的工作门早就能打开了...毕竟撬门也没那么慢,尤其是对专业的人来说。嗅探抓用户输入自然可以,不过从某些程度上而言也是脱裤子放屁一样的操作,因为一般情况下意味着你需要打开门锁面板。

    当然你是一个执行秘密任务的特工的话这事就另外讲了...
    loading
        4
    loading  
       2021-06-04 23:02:19 +08:00 via Android
    当你能读存储的时候,你都能挂恶意代码了,如果你认为需要挂安全芯片,客户买单吗?
    反正这个作为卖点我不买单,还不如你把机械锁芯做好一点。
    yanqiyu
        5
    yanqiyu  
       2021-06-04 23:13:32 +08:00
    既然你都能直接接触芯片内存了,直接开锁就行了为什么要绕这个弯子。

    当然如果记录了 /指定了密码位数的情况下滑动窗口就能解决问题

    对于没有记录密码位数的情况下,如果密码位数是某个特定的范围的(总不能允许用户设置任意长密码),问题退化成多项式时间。以及不能允许虚位密码任意长(不然和允许暴力破解无异),那么也就有一个耗时上限,我猜也不是不能接受。
    liuidetmks
        6
    liuidetmks  
    OP
       2021-06-04 23:18:46 +08:00 via iPhone
    @shoaly 每次做校验可能要重复几千上万次 hash 生成最终的 key ( pc 上一般是 10w 次以上)耗时上百毫秒,从原理上防止暴力枚举。
    而且这个密码是不定长,输入到后面可能会处理不过来造成卡顿。


    @loading 好吧,我杞人忧天了。物理上,门外没有输入口,希望蓝牙协议不要爆出严重漏洞导致密码指纹外泄。
    tankb52
        7
    tankb52  
       2021-06-04 23:20:45 +08:00
    因为密码被泄露,多数来源于偷窥,极少数才来自于读取芯片内存吧?
    Andrue
        8
    Andrue  
       2021-06-04 23:53:56 +08:00
    目前的技术里电子锁下面那个机械锁才是重点,和联网大规模攻击比起来直接短路开机械锁是最容易的
    Tink
        9
    Tink  
       2021-06-05 00:17:48 +08:00 via Android
    一定是明文的,不用多想
    ysc3839
        10
    ysc3839  
       2021-06-05 00:47:47 +08:00   ❤️ 2
    顺带一提,现在已经推荐使用 Argon2 而不是 PBKDF2 了。
    Orciorc
        11
    Orciorc  
       2021-06-05 00:56:35 +08:00 via Android
    题外话,始终不愿意使用指纹锁的最重要原因,是因为密码不可更换
    admin7785
        12
    admin7785  
       2021-06-05 01:05:30 +08:00 via iPhone
    同感,目前住自如,输密码开锁时,也感觉是 contains() 校验的
    FS1P7dJz
        13
    FS1P7dJz  
       2021-06-05 01:10:06 +08:00
    因为防范重点并不是这里

    防御重点第一点就是物理锁体部分达到标准,你这么惊讶我能告诉你,所谓的 ABC 级锁,所谓的技术开锁 10 分钟以上,在实际上中都是 1 分钟攻破,你会不会更惊讶,但这就是事实,几百块到几千块在开锁匠眼里都是 1 分钟完事,根本不需要涉及电子部分

    然后电子部分,主要漏洞依然是蓝牙 /wifi,和权限接入
    这部分应该就是 V2 大家熟悉的了,某米号称自有加密技术也是这部分在采用,除去蓝牙 /wifi 协议底层漏洞,可以直接通讯,还存在权限这一部分的需要破解,到了这一步,你密码明文与否其实并不重要,因为最终控制电机转动即可开锁,理论上你能制造一个强大的磁场带动电机旋转也可以

    其实最终还是成本和安全问题

    当然可以设计一个并不采用通用设计的物理锁,甚至一锁一设计,出品后设计图销毁,让锁匠开锁的时候非常折腾
    也可以设计一个完全防御各类电磁频闭,内部采用航天级别双备份双系统,设置对外协议也另起炉灶编写,所有通信交流需要专有设备
    键盘指纹虹膜声音啥都弄上,一个不匹配自动炸毁焊死锁芯

    可以,但是没必要
    EscYezi
        14
    EscYezi  
       2021-06-05 01:12:42 +08:00 via iPhone
    原来是这个功能吗🌚我一直以为是按#退格并且每次输错都按好几下#🌚
    说起来楼下单元门一个电打火就可以开,其实就是楼上说的短路直接开机械锁?
    SingeeKing
        15
    SingeeKing  
       2021-06-05 01:24:57 +08:00 via iPhone
    建议不要明文存储密码主要考虑的是数据库泄漏被用于撞库的情景,门锁密码这种只存在内存里不会上网,无法存在大规模攻击,所以并没有必要去刻意做加密
    GuuJiang
        16
    GuuJiang  
       2021-06-05 01:35:19 +08:00   ❤️ 1
    这其实是一个非常有意思的问题,不知道真实的密码锁是怎么实现的,但是假如让我来设计一个密码锁的话,我会采用下面的方案
    当设置密码时,将设置的密码编译为一个 AC 自动机(当然由于只有一个关键词,所以实际退化成了 KMP,不过也可以支持多密码),这样每按一个键时实际是在自动机中进行转移,当到达终结状态时就开门,这有个巨大的好处,无论前面输入的无效内容有多长,都不会带来时间和空间上的额外开销,理论上可以支持的无效内容长度没有上限
    假设密码锁真的采用了这样的方案,那么确实可以认为是明文存储的,虽然没有直接地存储密码本身,但是获得了完整的自动机等价于获得了密码,不过对于密码锁这种必需要物理接触才能使用的系统来说,直接暴力破坏恐怕都比试图读取存储要容易得多,所以是否明文存储已经不是那么重要了
    jinliming2
        17
    jinliming2  
       2021-06-05 01:53:39 +08:00
    边信道(有的叫旁信道、侧信道)攻击了解一下
    geniussoft
        18
    geniussoft  
       2021-06-05 02:01:58 +08:00
    如果达到这种级别的攻击,摄像头、旁路触摸、劫持触摸芯片的引脚都是无法解决的,而且更容易实现。
    levelworm
        19
    levelworm  
       2021-06-05 02:15:20 +08:00
    可以 dump 下来看看里头的东西。另外能不能防电击?据说很多电子锁在受到点击的时候会 reset,回到没有初始密码的情况,也就是可以打开了。
    levelworm
        20
    levelworm  
       2021-06-05 02:24:04 +08:00
    我想了下是不是这样,就是用一个窗口啥的,一个个移过去,这样就算是密文,也应该可以解密吧。比如说密文 6 位,你输入 40 位,这样他每次检测 6 位,不知道可行否?
    我知道有些车库的开关就是这样,只不过他是真的明文。
    toaruScar
        21
    toaruScar  
       2021-06-05 04:01:38 +08:00 via iPhone   ❤️ 2
    “窗口”的话就有德布鲁因序列的弱点了,显著降低的暴力破解的成本
    xuanbg
        22
    xuanbg  
       2021-06-05 07:13:34 +08:00
    @GuuJiang 0123456789 0123456789 ……一直输入就开了
    kop1989
        23
    kop1989  
       2021-06-05 07:29:45 +08:00 via iPhone
    如果是我来设计,我一定会存明文。
    1 、脱机存储
    2 、没有盗取密码有意义的场景。(除非用户非正确使用)
    delectate
        24
    delectate  
       2021-06-05 08:52:46 +08:00
    手持小米推拉式,猜想一下:
    1 、明文存储;
    2 、虚位密码,输入后有个明显的停顿才会解锁,而且有最大长度限制,大概是 50 个数字。这个期间可能是以 6 位为单位,从头到尾遍历了所有,然后看 hash 是否一致;
    3 、也可能是每次输入之后,从后向前截取 6 位直接对比,但是不开锁只记录令牌,停止输入后等待 1s 再看有没有令牌,再开锁。
    rekulas
        25
    rekulas  
       2021-06-05 09:29:54 +08:00
    这样的锁确实有安全风险,旁路嗅探对 aes 都存在一定威胁更别说明文了,虽然从性价比来说应该没人会去研究这个破解,但从安全角度来说不应该这样设计
    oott123
        26
    oott123  
       2021-06-05 09:34:35 +08:00
    首先字串是定长的
    其次就六位数字,你再厉害的 hash 也没用,拿个手机 CPU 都能一秒钟之内就给你暴力算出来
    no1xsyzy
        27
    no1xsyzy  
       2021-06-05 09:50:56 +08:00
    @delectate 明显停顿后解锁是有意的,就是为了防止 @toaruScar 提到的「德布鲁因序列」攻击
    因为每次输入限长,全排序列长度很容易就超过了。
    toaruScar
        28
    toaruScar  
       2021-06-05 10:17:31 +08:00 via iPhone
    @no1xsyzy #27 要绕过这个限制也简单,每次开始前把上次尝试的后几位也输进去就行了
    6 位数字的德布鲁因序列有 10 万个数字左右,一秒输入 10 个数字,只要 10000 秒就可以了,不到三个小时
    就算隔 5 秒要停 1 秒,效率也还算合理。
    aureole999
        29
    aureole999  
       2021-06-05 10:22:35 +08:00
    rolling hash 了解一下。不过用没用在锁上就不知道了。
    GuuJiang
        30
    GuuJiang  
       2021-06-05 10:22:43 +08:00 via iPhone
    @xuanbg 要不你再好好想想?匹配的是子串,不是子序列
    no1xsyzy
        31
    no1xsyzy  
       2021-06-05 10:27:13 +08:00
    @toaruScar 你这是什么手速一秒 10 个数字?职业选手肌肉记忆按键 APM 都没有 600 吧
    toaruScar
        32
    toaruScar  
       2021-06-05 11:00:19 +08:00 via iPhone
    @no1xsyzy #31 暴力破解 10 万个数字肯定不能用手输了吧,至少有点自动化吧……
    lysS
        33
    lysS  
       2021-06-05 11:11:06 +08:00   ❤️ 5
    懂了,输 π 就行了
    x86
        34
    x86  
       2021-06-05 11:34:58 +08:00 via iPhone
    锁匠:你讲的是咩啊?
    zxcslove
        35
    zxcslove  
       2021-06-05 11:49:25 +08:00
    电子锁必然要限制输入方式的,不然毫无意义。很多杂牌都是一把螺丝刀捅开,机械安全(相对)是第一位的。
    Rheinmetal
        36
    Rheinmetal  
       2021-06-05 11:50:53 +08:00
    @no1xsyzy 当然是嗅探接口重试了
    mxT52CRuqR6o5
        37
    mxT52CRuqR6o5  
       2021-06-05 11:52:42 +08:00 via Android
    内部存储是不是明文并不是电子锁安全的瓶颈
    服务器里存的密码都加盐 hash 是因为大多数的服务数据库都直接 /间接暴露在公网上
    dangyuluo
        38
    dangyuluo  
       2021-06-05 11:55:30 +08:00
    单纯考虑下存储方式,可能是这样的,第一次输入密码的时候,存储密码的 md5 (或其他摘要方式)值和密码长度(记作 n )。当你输入一个 m 长的密码时,会从第 0 位开始匹配,每次匹配 n 个数字,直到第 m-n 为止。如果有匹配的就开锁。
    dangyuluo
        39
    dangyuluo  
       2021-06-05 11:55:58 +08:00
    当然这个匹配过程也是进行 md5 (或其他摘要)
    Stain5
        40
    Stain5  
       2021-06-05 11:59:32 +08:00
    明文 加密储存有意义吗

    这种锁你有不可能设几十位密码,单纯的十位以内数字的数据 碰撞破解也就不到一天的事

    就算不从密码下手,把你指纹的特征提取出来,进行离线测试
    大约跑 300w 次就能筛选出一个碰撞模型来通过你的指纹锁
    beijiaoff
        41
    beijiaoff  
       2021-06-05 11:59:58 +08:00   ❤️ 1
    每输入一位,就检查前面 6 位就行了呗。
    你的举例中,最后几位 6 就不用管了,因为已经出现正确密码了,锁就认为你是主人了。
    当然还要限定一下总位数,比如不能超过 50 、100 这种明显捣乱的。
    liuidetmks
        42
    liuidetmks  
    OP
       2021-06-05 12:29:20 +08:00
    @mxT52CRuqR6o5 蓝牙协议是一个弱点,这个锁能通过蓝牙网关联网的。可以通过蓝牙网关远程控制。也就是说用户的密码会通过 用户手机-> 厂商服务器->蓝牙网关->门锁,这其中最孱弱的估计是蓝牙这一块(主观感受,新闻里面经常说蓝牙 xxx 漏洞)
    intellectual
        43
    intellectual  
       2021-06-05 13:32:46 +08:00
    基本上所有的锁都是防君子不防小人。。。
    现在锁的目的其实就是为了不带钥匙,方便。。。

    你去查一下技术文档,各种级别的锁有规定需要在啥时间可以用开锁器打开。很多 5000 块的锁,1 分钟就能打开的。醒醒吧。
    yellowV2ex
        44
    yellowV2ex  
       2021-06-05 15:01:08 +08:00
    我认为这不是 bug,是一个 Feature,为了就是你输错前几个字母的时候不用按取消不用等几秒重置,随时直接输入对的密码即可开门,就算多输入几位也可以。
    ziseyinzi
        45
    ziseyinzi  
       2021-06-05 15:08:43 +08:00
    你都说蓝牙网关了,不就相当于说是哪家了……
    xcstream
        46
    xcstream  
       2021-06-05 15:29:22 +08:00
    这不是机械容易破解的问题,这是个算法问题。
    验证的是最后 6 个数字,又不是所有历史输入(狗头),哪里来的多项式复杂度。
    pcbl
        47
    pcbl  
       2021-06-05 15:30:33 +08:00 via Android
    楼上说暴击破解的是来搞笑的吗?连续错误会延迟输入的
    shawnsh
        48
    shawnsh  
       2021-06-05 16:06:12 +08:00 via Android
    不同厂家的电子锁实现应该不一样,什么情况都有
    est
        49
    est  
       2021-06-05 18:01:49 +08:00
    猜黑盒子水平,楼主不合格,2 楼满分!

    用户输入数字 -> 回头检查 6 位是否为正确密码(管你明文还是 hash )

    如果检查正确,那么就是否开锁 -> true,等用户停止输入一段时间就执行电机开锁,完毕。

    其实这也可以产生一个问题,如何输入最短的数字串,用来穷举完所有 6 位密码组合?(或者先把条件简化为 3 位密码)
    agostop
        50
    agostop  
       2021-06-05 18:16:35 +08:00
    @shoaly 如果真的只是存的 hash,你怎么知道是 6 位的密码?
    Valid
        51
    Valid  
       2021-06-05 18:26:38 +08:00
    防君子不防小人的东西加不加密都不重要
    namelosw
        52
    namelosw  
       2021-06-05 19:04:39 +08:00
    如果是不定长的话,的确不用明文存储很难做到。

    定长的话就是最后 N 位,也就是 O(n),只是加密算法的常数都很大。
    namelosw
        53
    namelosw  
       2021-06-05 19:07:30 +08:00
    @oott123 PBKDF2 Aragon 这种别提手机了,6 位的话,就算用很快的电脑,0.2 秒一个,也得算个几小时。

    除非直接用字典,但是加个盐就得重新算了。
    dLvsYgJ8fiP8TGYU
        54
    dLvsYgJ8fiP8TGYU  
       2021-06-05 19:24:11 +08:00
    就算电子部分的算法设计再巧妙,只要有失灵 /没电的可能,就需要留一个机械钥匙孔做备份,也就多了一个攻击面。机械锁芯抗技术开锁的能力如何?

    有些电子锁还有 Wi-Fi/蓝牙(甚至未来不排除有厂家用物联网卡)这些通信模块,用来实现一些(高情商:物联网智能化;低情商:花里胡哨)的功能,又多了一个攻击面。

    数字密码锁:别人涂一点特殊染料到你键盘上,观察哪些数字经常被按,再用排列组合是不是更快?

    指纹锁:现在不会还有光学指纹吧?指纹膜了解一下?半导体 /电容指纹锁不知道能不能用这种方法攻破

    卡片:用的是 IC 还是 ID ?不会还有扇区不加密的卡片锁吧?抗复制性能怎么样?

    别人拿个大功率远程读取器从几米外读你身份证 /带闪付功能的银行卡 /护照的案例了解一下?有没有人体验过经过某种安检门后,手机的 Apple Pay 界面莫名其妙弹出的?是不是出门还得把你的卡片放在防 RFID 的卡套里面?

    手机手表的 NFC 啥时候能用来开锁也是不错的

    单一因素认证风险都不可忽略,最好选支持双因素认证的锁。门口装个摄像头也是不错的选择。
    zx4824
        55
    zx4824  
       2021-06-05 19:56:08 +08:00
    呃,不懂技术细节就问,为什么要假设这种耸人听闻的呢?

    首先设置的密码是有位数限制的,比如 4-16 位

    那只需要分别记录

    “最后输入的 4 位数”
    “最后输入的 5 位数”
    。。。
    “最后输入的 16 位数”

    总共 13 个字符串,然后 hash 比对,其中有一个符合就可以了
    这点 hash 量很轻松


    哪家正规大厂会冒着损害商誉的风险,搞这种明文存储的低级失误。
    zgzb
        56
    zgzb  
       2021-06-05 20:11:25 +08:00
    去重,取后六位
    jiangzhizhou
        57
    jiangzhizhou  
       2021-06-05 20:14:53 +08:00
    老哥,锁都是防君子,防不了小人。
    密码锁仅仅只是为了让你别带钥匙而已。
    在 CN 警察敲门你敢不开门么?
    真的要开门,早就砸了
    janxin
        58
    janxin  
       2021-06-05 21:16:13 +08:00
    很多人想当然了,就没考虑过在中间和最开头的情况么...为什么假设正确密码一定就在最后...
    beijiaoff
        59
    beijiaoff  
       2021-06-05 22:44:13 +08:00
    @janxin 在中间也没啥问题呀。只要检测到连续 6 个是对的,就判定是主人了。后面就不用检测了。等输入停顿后执行开锁即可
    LithiumLee
        60
    LithiumLee  
       2021-06-05 23:53:19 +08:00
    明显是明文密码,只要处理物理密码和处理网络部分分开就行,你从网络上也无法获取他真实密码就可以了
    毕竟你都把锁拆开了读芯片了,你为啥不直接把门一起开了呢,开锁机构就一个电机而已,你给电机上电门就开了
    这种智能门重点就是不要让人通过网络黑进来开了就行
    LithiumLee
        61
    LithiumLee  
       2021-06-05 23:55:08 +08:00
    想安全还是在门里面装个触发机构,自动报警比较安全
    janxin
        62
    janxin  
       2021-06-06 14:25:28 +08:00
    @beijiaoff 最长十几位呢…
    janxin
        63
    janxin  
       2021-06-06 14:26:41 +08:00
    @beijiaoff 你应该没用过吧,这种密码位数都是可都是可变的,最长可以十几位
    msg7086
        64
    msg7086  
       2021-06-06 15:03:16 +08:00
    @agostop #50
    > 如果真的只是存的 hash,你怎么知道是 6 位的密码?

    密码的长度是个数字,其实是可以存的。你可以把 6 存在存储器里,不贵。

    @liuidetmks #6
    你用软件可以每秒输入几百万个数字来离线穷举,所以才需要重复 hash 。
    但是密码锁,就算你单身 30 年的左手也未必能一秒按十次。
    就算是要防止电信号直接连接暴力破解,锁内部直接 sleep 一下就好了,没必要反复计算。

    反复计算抗爆破的前提是你需要防止别人拿到 hash 以后在另一台电脑上爆破。
    但是通常不会有人破解门锁的时候去读门锁内部的 hash 。
    毕竟你都能读到门锁内部的数据了,为什么不把锁直接拆了。
    msg7086
        65
    msg7086  
       2021-06-06 15:08:15 +08:00   ❤️ 1
    另外推荐看看撬锁律师的视频,可能会让你对锁有更深的了解。

    https://www.youtube.com/c/lockpickinglawyer/videos?view=0&sort=p&flow=grid
    julyclyde
        66
    julyclyde  
       2021-06-07 10:57:22 +08:00
    其实和网络身份验证的“PIN+TOKEN”类似,这部分是明文的
    网络一般依赖于更底层的加密传输
    门锁依赖于前后部的连线不外露
    morningtzh
        67
    morningtzh  
       2021-06-07 12:48:02 +08:00
    鹿客 6 位密码,16 位虚密码。无脑 hash 16 次搞定
    leafin
        68
    leafin  
       2021-06-07 22:45:32 +08:00
    我没用过,但我猜密码是定长的,或者保存密码的同时保存 hash 和密码长度。

    假设密码长度是 6,输入长度是 10,验证时从前往后每次截取相邻的 6 个字符进行 hash 比较,只需要比较 10-6+1=5 次就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2749 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.