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

2018-01-03 12:03:59 +08:00
 hugee

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

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

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

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

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

门如此管理密钥:

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



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

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

电脑上的软件,早就有人这么玩过了,破解方法就是用硬盘还原卡或者影子系统。
dream7758522
2018-01-03 19:00:52 +08:00
密码锁里面维护一个次数表,然后生成密码的时候将最大开门次数用某种方式加进入。
hugee
2018-01-03 23:21:04 +08:00
@TimePPT 这是临时密码,就是应对没卡的情况的
hugee
2018-01-03 23:24:16 +08:00
门上只是个单片机而已,不要把它功能和算力想得太高。生成的密码也仅仅只能是数字,并且位数不能太长,十位以上就影响体验了。
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
2018-01-03 23:26:53 +08:00
@dream7758522 这种方式完全不现实的。
wevsty
2018-01-03 23:28:45 +08:00
HOTP 就行了,用一次就失效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX