V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
课程减减-极客时间优惠返现
极客时间 400+ 门体系课,大量最新 AI 课程,百万程序员的进阶课程库。与极客时间官方合作,购买课程后归还返现红包,买课更优惠。
Promoted by windliang
UserName99
V2EX  ›  程序员

自如的密码锁有个问题,只要输入密码包含正确密码就能开锁

  •  
  •   UserName99 · 2024-07-25 16:10:15 +08:00 · 3881 次点击
    这是一个创建于 384 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个问题存在好几年了,每次误触后还能开门就会纠结这个问题,比如正确密码是 A ,那么输入 A 、123A 、A123 、123A456 这几种都能开锁,这是个 bug 还是 feature 。然后又想到了另一个问题,他们是不是存的明文密码,如果是密文怎么判断输入密码包含正确密码的,就想到一个循环一下,每个字符后推 6 位加密后和存储的密文做对比,可能要循环很多次,还有其他什么好的算法吗?
    32 条回复    2024-07-26 15:51:15 +08:00
    mnsw
        1
    mnsw  
       2024-07-25 16:10:49 +08:00 via Android
    虚位密码。
    MJTest
        2
    MJTest  
       2024-07-25 16:11:53 +08:00   ❤️ 9
    是 feature.
    B1ankCat
        3
    B1ankCat  
       2024-07-25 16:13:07 +08:00   ❤️ 1
    这是 feature ,就是为了让你可以随便输入,包含正确密码就能进去,防止被别人偷窥到
    FabricPath
        4
    FabricPath  
       2024-07-25 16:14:58 +08:00   ❤️ 2
    feature ,当你背后有人站在的时候,你乱打几十个数字也能开门,但是对方不知道你真实密码是什么。
    你这个算法想的有点复杂,单片机大概率不能动态分配内存,不好处理“动态长度”的数据;简单的方式是,你每按一个数字,比如你正确的密码是 234 ,你敲 1 的话,和 4 比较,不正确;
    敲 2 ,和 2 比较,正确;
    敲 3 ,和 3 比较,正确
    敲 5 ,和 4 比较,不正确,清零。

    当中途有匹配的密码之后,开锁 flag 置位,就不会再管后面你敲了什么,按下#的时候判断开锁 flag 。
    FabricPath
        5
    FabricPath  
       2024-07-25 16:15:43 +08:00
    @FabricPath “你敲 1 的话,和 4 比较” -> "你敲 1 的话,和 2 比较"
    yanqiyu
        6
    yanqiyu  
       2024-07-25 16:17:39 +08:00   ❤️ 1
    判断密码就状态机(参照 kmp ),什么都不用存,存一个当前识别到几位连续密码就行,数据读一个丢一个

    肯定存的是明文密码,密码锁存个明文密码没有任何困难和安全风险
    EJW
        7
    EJW  
       2024-07-25 16:18:35 +08:00
    feature ,我家新换的德施曼智能门锁也是这样。
    xubeiyou
        8
    xubeiyou  
       2024-07-25 16:21:31 +08:00
    密码锁都这样- -
    MJTest
        9
    MJTest  
       2024-07-25 16:26:00 +08:00
    @EJW 我最近也想换 德施曼感觉用的怎么样啊?尤其是耗电量 谢谢
    SimonOne
        10
    SimonOne  
       2024-07-25 16:31:16 +08:00
    这是 feature 啊,哥们,你不会突然灵光一闪吗
    shadowyue
        11
    shadowyue  
       2024-07-25 16:33:06 +08:00
    虽然知道这个是 feature ,不过我挺好奇为啥这么统一
    EJW
        12
    EJW  
       2024-07-25 16:43:29 +08:00
    @MJTest
    1. 买的 q5s ,密码和指静脉用起来没啥毛病。
    2. 如果门不符合,安装师傅现场施工,服务不错。
    3. 四月初买的,用到现在还有 65%的电。
    4. app 功能不多,但是做的还可以。wx 公众号有开门推送。
    MoYi123
        13
    MoYi123  
       2024-07-25 17:14:18 +08:00
    密码固定 6 位,输一次密码算一次 md5(password[-6:]) 不就行, 这还要什么算法吗?
    sennes
        14
    sennes  
       2024-07-25 17:33:32 +08:00
    那理论上是不是可以用 De Bruijn sequence 破解
    ISOtropy
        15
    ISOtropy  
       2024-07-25 17:41:17 +08:00 via Android   ❤️ 2
    我要是能输入一个π岂不是都可以破解
    belin520
        16
    belin520  
       2024-07-25 17:42:41 +08:00
    @shadowyue 因为可能这个是密码锁标配的基础能力/基础功能
    deplives
        17
    deplives  
       2024-07-25 17:46:11 +08:00
    老哥,所有的密码锁都支持啊,这个叫虚位密码,假定你不信任当前输入密码的环境,可以在连续正确密码前后增加任意多的字符,保证密码不被泄露
    krixaar
        18
    krixaar  
       2024-07-25 17:52:56 +08:00
    @sennes #14 可以,毕竟单纯按理论的话六位密码直接从 000000 按到 999999 就破解了……
    Inn0Vat10n
        19
    Inn0Vat10n  
       2024-07-25 17:56:55 +08:00
    @krixaar 失败多次就锁死保护了,必须重设密码
    Tsing2
        20
    Tsing2  
       2024-07-25 18:18:23 +08:00
    我猜楼主想问的是,如果使用虚位密码功能,那锁里保存的就不是密码的哈希而是密码的明文了,不然运算量有点大
    ysc3839
        21
    ysc3839  
       2024-07-25 18:21:35 +08:00 via Android
    @FabricPath 但是对方看到完整密码后输入进去也能解锁,感觉意义不大,只有在对方不能完整看到的情况下有点用,或者可能是增加容错率,避免不小心碰到别的数字再输入正确密码失败。
    tinytoadd
        22
    tinytoadd  
       2024-07-25 18:22:19 +08:00
    @tlsmars009 正常的密码锁,输入一个 pi 也可以打开😺
    meisa
        23
    meisa  
       2024-07-25 18:38:54 +08:00
    @Inn0Vat10n 我把每一种 6 位数字组合全部按一遍,到最后的时候才按 # 开锁,理论来说这样无论如何我都能开锁。
    jim9606
        24
    jim9606  
       2024-07-25 18:39:59 +08:00 via Android   ❤️ 1
    防偷窥不合理,因为只要完整重放多头多尾的密码一样可以开锁。
    省内存这个存疑,我不觉得现在有 wifi 功能的 mcu 会负担不起这点代价,可能只是单纯沿用以前弱鸡 mcu 的交互设计。
    交互上,多数密码锁没有清空输入按键也没屏幕提示位数,支持这种输入可以免去对这两者的需求(故意输错虽然可以但会累计错误次数,不能等同于清空输入)
    mcfog
        25
    mcfog  
       2024-07-25 19:02:36 +08:00
    多按几位还有一个好处是避免长期使用以后,密码的那几个按键痕迹/磨损到有肉眼可见的差异
    Ruikoto
        26
    Ruikoto  
       2024-07-25 19:21:58 +08:00
    @jim9606 这个防偷窥是防你输了 6 位被直接记下来的,如果你输入 20 位的虚位密码还被人偷窥走了,那还是用指纹吧
    CSGO
        27
    CSGO  
       2024-07-25 20:36:05 +08:00 via Android
    这个挺好,
    churchmice
        28
    churchmice  
       2024-07-25 23:56:54 +08:00
    你只要密码长度的是固定的,里面存 hash 也是没有问题的
    输入的数据存在一个 buffer 里面,用个滑窗挨个算 hash 就行,计算量也不大
    但是现实的问题是大家都偷懒不会这么做,我见过太多做安全的应用,号称多么安全,最后把钥匙挂门上的设计
    安全这东西最重要的是安全意识,可惜大多数人没有
    反过来你如果有安全意识,你的设计成本会增加,反而会被劣币驱逐,乳汁奈何
    SimonOne
        29
    SimonOne  
       2024-07-26 01:14:21 +08:00
    @jim9606 #24 记住 6 位密码和记住 20 位密码的难度是不一样的,我只要确保胡按的里面夹上正确的就行,偷窥记密码的人可没那么轻松了。
    JustBecause
        30
    JustBecause  
       2024-07-26 09:31:21 +08:00
    @ysc3839 多加几位就好了,我当着面输 20 位密码,看得人也记不住啊,实在不行我输 30 位 40 位
    Ainokiseki
        31
    Ainokiseki  
       2024-07-26 11:20:15 +08:00
    @FabricPath 如果是这样的话,假设正确密码是 2324 ,输入“232324”会无法判断通过的
    grady8866
        32
    grady8866  
       2024-07-26 15:51:15 +08:00
    @meisa 锁体有限制虚位密码长度啊,像米家的就是最长 20 位,不可能没完没了让人输入的
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1636 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:27 · PVG 00:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.