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

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

  •  
  •   liuidetmks · 62 天前 · 5444 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

    定长的话就是最后 N 位,也就是 O(n),只是加密算法的常数都很大。
    namelosw
        53
    namelosw   61 天前
    @oott123 PBKDF2 Aragon 这种别提手机了,6 位的话,就算用很快的电脑,0.2 秒一个,也得算个几小时。

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

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

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

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

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

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

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

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

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

    那只需要分别记录

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

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


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

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

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

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

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

    假设密码长度是 6,输入长度是 10,验证时从前往后每次截取相邻的 6 个字符进行 hash 比较,只需要比较 10-6+1=5 次就行了。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   970 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:59 · PVG 03:59 · LAX 12:59 · JFK 15:59
    ♥ Do have faith in what you're doing.