支付宝离线支付条形码生成的算法是怎样的?? 举报 理由 举报 取消 1. 离线可使用2. 根据一串数字可以获取user信息3. 保证所有用户不生成同样的一串数字4. 可以更新,生成新的一串数字(可以离线手动更新,几秒钟就换一个)怎样的算法能做到这一点? 2018年2月4日 4 条回复 2614 次浏览 互联网,支付宝,算法,编程,行业
回复 ( 4 )
UUID
不知道怎么算的,但是知道一个密码锁的密码生成方法
基于此,我估计支付宝的离线支付也是如此,那就是APP本地有临时条码的生成规则,然后系统也有。所以只有人一扫这个条码,系统其实就知道了。
这里面具体的生成算法其实并不重要,保持两端算法一致或者有关联即可。
这个算法应该再考虑两个问题:一是离线码被人偷拍后使用,或者说被人偷拍后持有。二是使用不对称加密来保证这个码是自己生成。 所以这个算法应该包括以下需求即可。
1. 能代表自己的账户(刚需)。
2. 一定时间内失效(比如一分钟内)。
3. 一次有效(防止被人偷拍持有后多刷)。
4. 告知服务器自己的使用设备(跟踪历史记录用,非刚需)。
所以这个码只要包含以下3项数据,应该就可以了:
1. 自己的支付宝User ID。
2. 基于当前时间算出的token。
3. 用一个数字代表生成该码的设备.
(以上数据完全可以本地离线获得,至于算法,基本就是用自己的支付宝私钥去把以上数据加密, 具体算法你开心就好。。:) )
然后服务器端保证两件事:
1. 根据这个token获取码的生成时间,保证一定时间后失效。
2. 同token的码,只能使用一次。
我试了下在离线状态下生成支付宝的支付码,和微信的支付码,都是退出再生成,码就会变。 基本证实以上想法。
追加:
考虑到支付宝的私钥公钥的生成, 我猜测是不是应该在每次登陆时就计算一把,然后上传公钥? 不然登陆后服务器下载自己的私钥岂不是不安全? 那如果是这样, 我前面所说的告知服务器自己使用的设备,就是刚需了, 这样才能让服务器知道用哪个公钥来解密。 (毕竟现在可以手表手机多端登陆。)
这段猜测比较幼稚, 请大牛打脸指正!
刷题主微博看到题主这个问题=_=,某天在回家路上也想过这个问题
说个猜想吧。算法比较烂,也从来没研究过密码学,所以说的可能不对。
反过来想,如果产品突然一天跑来和你说我要抄支付宝微信这个付款码的功能(虽然产品肯定不会直接说抄),要能离线,最简单的怎么做?
那我直接把该用户的某某唯一id展示成二维码让你扫呗~反正扫码联网扣钱的都是在扫描终端,只要扫码端能联网就可以了,扫码端告诉服务器我要扣这个id的家伙的钱
然后你说拿别人拿这个不是随便扣我钱?
那就学U盾什么的,做个一次性密码OTP呗(One-time Password Algorithm),网上搜搜什么TOTP(Time-based One-time Password Algorithm),HOTP(HMAC-Based One-Time Password Algorithm)什么的。时间同步,什么什么信息同步什么的当然在有网的时候先做好呗。
然后你说id直接暴露不太好吧
……那就搞个可逆的算法(貌似太多)id藏起来呗
于是……付款码数字就变成了……噔噔噔噔~…… 可逆算法加密(id)+OTP密码……
再要安全性加点什么校验值啊什么的
—
针对题主问题:
1. 可逆和OTP貌似都能离线算
2. 反过来想…..这串数字是用uid的可逆算法算出来的
3. 每个用户uid本身就不一样
4. OTP的事
—
plus
写答案的时候又玩了下付款码,进入后一分钟一次,退出再进去马上就变了。所以我想,如果是TOTP的话,一分钟前的OTP密码是有效的,当前的密码在一分钟后也是有效的,按只安秒作区分的话,有两分钟120个opt密码值=_=,不过貌似对阿里来说也不算什么。
请大牛打脸指正