生成有次数限制的离线密码方法方案? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hugee
V2EX    问与答

生成有次数限制的离线密码方法方案?

  •  
  •   hugee 2018-01-03 12:03:59 +08:00 4134 次点击
    这是一个创建于 2841 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应用场景:无网络情况下。 管理员生成一个指定使用次数的密码(时间无限制),达到使用次数后失效. 用户拿着这个密码就可以开启房门。

    也就是说管理员控制的密码生成程序和门上的控制程序产生的密码要对得上,才能打开。

    想不到怎么实现,有没有大神指点一下?

    第 1 条附言    2018-01-06 15:46:40 +08:00

    这个是别人已经实现了的功能。 APP端和门这边没任何通讯,即可实现密码检测、开门。 ls.jpg jc.jpg xs.jpg

    31 条回复    2018-01-08 00:10:30 +08:00
    546669204
        1
    546669204  
       2018-01-03 13:43:57 +08:00
    如果不要求多门共享次数的话还是比较容易的
    明文密码 (我是密码,快开门呀,我只能用 X 次,我在 2018 年 1 月 3 日 13:40 生成)
    然后通过加密编码压缩等等操作获得一段 key
    房门上的程序进行各种解码 然后效验密码 和判断打开次数 就可以了。
    geelaw
        2
    geelaw  
       2018-01-03 13:59:17 +08:00 via iPhone   3
    考虑一个不可伪造( existential unforgeability )签名系统,管理员和门分别可以产生和验证签名,管理员如此产生开门密钥:

    选择一次性随机串 r,选择初始次数 k,产生 (r, k) 的签名 s,把 (r, k, s) 作为钥匙。

    门如此管理密钥:

    接到 (r, k, s) 的时候,先验证 s 是 (r, k) 的签名,如果不是有效,则拒绝。
    接着查看内部表格里面是否有 r,如果没有,设置 r 的剩余开门次数是 k。
    重新查看内部表格里 r 的开门次数,如果是 0 则拒绝,否则减少一次开门次数并开门。



    当然楼主对这个模型的定义不是很完善,所以无法形式化证明这个构造是安全的比如我得知道“安全”是什么意思。
    kraymond
        3
    kraymond  
       2018-01-03 15:12:52 +08:00
    @geelaw 膜一发密码学 dalao
    takato
        4
    takato  
       2018-01-03 15:30:32 +08:00
    @geelaw 这样把门记录 remaining_r 的数字 hack 掉就知道了,感觉这个 remaining_r 也要加入加密体系中才可以。
    takato
        5
    takato  
       2018-01-03 15:32:04 +08:00
    @geelaw 换而言之,对已知 r,k,防范超过 k 次开门的行为,防范不足啊。。
    akira
        6
    akira  
       2018-01-03 16:28:45 +08:00
    控制程序 预先创建一定数量的密码和次数限制,管理员这边挑个没用过的给用户就是了
    geelaw
        7
    geelaw  
       2018-01-03 16:35:17 +08:00
    @takato 没理解您的意思我假设门的系统是不能被改换的,否则不妨不直接让门自己开开就好。如果您仍然觉得这个方案不是看似可行的,是否可以形式化描述一下如何攻击?
    neosfung
        8
    neosfung  
       2018-01-03 16:42:13 +08:00
    https://jwt.io/
    可以考虑使用 jwt,在 payload 中添加一个字段表示初始次数。
    第一次读取的时候获取初始次数,并写入系统。以后每次读取时,检索到已经存在这个 jwt,就直接将次数减一。
    #2 的是简单的流程
    takato
        9
    takato  
       2018-01-03 17:30:29 +08:00
    @geelaw 防止门的系统被改换也需要密码学设计。合法用户授权用了非对称加密,而次数管理却使用了普通数据库。。所以此处必定会被盯上的。

    参考一下环状签名的实现和设计或许会对思路有帮助。
    hugee
        10
    hugee  
    OP
       2018-01-03 17:56:07 +08:00 via Android
    忘记说一点很重要的了:门上只能输入 0 到 9 的数字和*#
    murusu
        11
    murusu  
       2018-01-03 17:56:18 +08:00
    @takato 能 hack 掉 remaining_r 的数字证明系统已经被完全入侵,对在这种情况下能保住系统安全我表示怀疑,如果你真的有这种情况下的防护方案,我真想请教一下
    takato
        12
    takato  
       2018-01-03 18:25:05 +08:00
    @murusu 我的意思是两边均不能保存 remaining_r 的明文,验证过程也不能取明文的 remaining_r..这里需要再思考下,但绝对不会是上文所述的直白方法。
    TimePPT
        13
    TimePPT  
    PRO
       2018-01-03 18:57:08 +08:00
    如果不是非要按键输入的话,直接用门卡系统很好解决吧
    msg7086
        14
    msg7086  
       2018-01-03 19:00:31 +08:00
    如果能 hack 进系统,说明你已经有足够的能力改动内部状态了。
    那为什么不直接冻结内部状态,把有限次数认证转换成无限次数呢?

    电脑上的软件,早就有人这么玩过了,破解方法就是用硬盘还原卡或者影子系统。
    dream7758522
        15
    dream7758522  
       2018-01-03 19:00:52 +08:00 via Android
    密码锁里面维护一个次数表,然后生成密码的时候将最大开门次数用某种方式加进入。
    hugee
        16
    hugee  
    OP
       2018-01-03 23:21:04 +08:00 via Android
    @TimePPT 这是临时密码,就是应对没卡的情况的
    hugee
        17
    hugee  
    OP
       2018-01-03 23:24:16 +08:00 via Android
    门上只是个单片机而已,不要把它功能和算力想得太高。生成的密码也仅仅只能是数字,并且位数不能太长,十位以上就影响体验了。
    geelaw
        18
    geelaw  
       2018-01-03 23:24:35 +08:00
    @takato remaining_r 是什么?是指 (r, k, s) 对应的剩余次数,还是指 (r, k, s) 里面的 r ?

    提醒:无论如何处理 (r, k, s) 里面的 (r, k) 这部分,也不能保证 (r, k) 是隐匿的因为一个不可伪造的签名机制可以把 (r, k) 在 s 里面明明白白写出来。如果你想藏匿 (r, k),你必须用其他要求的密码原语。
    hugee
        19
    hugee  
    OP
       2018-01-03 23:26:53 +08:00 via Android
    @dream7758522 这种方式完全不现实的。
    wevsty
        20
    wevsty  
       2018-01-03 23:28:45 +08:00
    HOTP 就行了,用一次就失效
    dream7758522
        21
    dream7758522  
       2018-01-03 23:46:53 +08:00 via Android
    @hugee 为什么不现实
    hugee
        22
    hugee  
    OP
       2018-01-04 09:57:22 +08:00
    @dream7758522 每个生成的密码都能指定不同的指定次数,每次生成的密码都不一样。想想就知道了……
    geelaw
        23
    geelaw  
       2018-01-05 14:14:07 +08:00 via iPhone
    @hugee #22 那您自己已经有答案了呀:这个应用场景是不现实的。
    hugee
        24
    hugee  
    OP
       2018-01-05 22:23:42 +08:00 via Android
    @geelaw 我说的是他的那种方式不现实。行业内已经有人实现了,我想弄清楚是怎么实现的。我电脑上有截图,明天我发出来给你看下。
    hugee
        25
    hugee  
    OP
       2018-01-06 15:47:09 +08:00
    @geelaw 看下顶楼,我已补图。
    geelaw
        26
    geelaw  
       2018-01-06 16:19:30 +08:00
    您可以试试手机开飞行模式之后建立新的密码,然后尝试解锁,看能不能做到。
    hugee
        27
    hugee  
    OP
       2018-01-06 16:35:11 +08:00
    @geelaw 完全可以,并且锁里面也没联网芯片的。
    geelaw
        28
    geelaw  
       2018-01-06 16:36:42 +08:00
    @hugee 那请问你是否可以在生成之后修改密码的剩余次数?同样是要飞行模式。
    hugee
        29
    hugee  
    OP
       2018-01-06 17:14:39 +08:00
    @geelaw 修改不了。就算删了,还能开(如果使用次数没到的话)。
    Asshasahole
        30
    Asshasahole  
       2018-01-07 12:22:28 +08:00 via iPhone
    用时间和算法确定一个可用密码池,密码被使用时验证是否在可用密码池中,验证成功则生效并记录,已被记录的密码单独维护权限,可以通过手机与锁连接修改密码类型等。这种离线密码是以牺牲安全性为代价的,同一时刻可用密码有一定的数量,并且密码本身要包含类型等数据,位数会长一点。我有九成把握。
    xiaosaiyin
        31
    xiaosaiyin  
       2018-01-08 00:10:30 +08:00
    随机数 r, 使用次数 k, 验证位 s
    生成密码为 E( r k s, key)
    验证时 r k s = D(m,key) 然后 检测验证位是否正确,这样可以隐藏(r,k)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2994 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86