支付宝离线支付条形码生成的算法是怎样的??

理由
举报 取消

1. 离线可使用2. 根据一串数字可以获取user信息3. 保证所有用户不生成同样的一串数字4. 可以更新,生成新的一串数字(可以离线手动更新,几秒钟就换一个)怎样的算法能做到这一点?

2018年2月4日 4 条回复 2614 次浏览

发起人:John S 初入职场

居港上海人,ICT行业

回复 ( 4 )

  1. 无少
    理由
    举报 取消

    不知道怎么算的,但是知道一个密码锁的密码生成方法

    这个应用的场景是:

    锁在的房子没有网络,用户忘记了密码,于是通过app获取一个临时密码,这个密码10分钟有效。

    如何保证系统获取的密码和系统密码相同呢?

    那就是所本地和系统有同一套临时密码生成算法,都是每10分钟自动更新,也就是保证任何时间你从系统获取的密码都和锁本地生成的密码是一致的。

    基于此,我估计支付宝的离线支付也是如此,那就是APP本地有临时条码的生成规则,然后系统也有。所以只有人一扫这个条码,系统其实就知道了。

    这里面具体的生成算法其实并不重要,保持两端算法一致或者有关联即可。

  2. 书生
    理由
    举报 取消

    这个算法应该再考虑两个问题:一是离线码被人偷拍后使用,或者说被人偷拍后持有。二是使用不对称加密来保证这个码是自己生成。 所以这个算法应该包括以下需求即可。

    1. 能代表自己的账户(刚需)。

    2. 一定时间内失效(比如一分钟内)。

    3. 一次有效(防止被人偷拍持有后多刷)。

    4. 告知服务器自己的使用设备(跟踪历史记录用,非刚需)。

    所以这个码只要包含以下3项数据,应该就可以了:

    1. 自己的支付宝User ID。

    2. 基于当前时间算出的token。

    3. 用一个数字代表生成该码的设备.

    (以上数据完全可以本地离线获得,至于算法,基本就是用自己的支付宝私钥去把以上数据加密, 具体算法你开心就好。。:) )

    然后服务器端保证两件事:

    1. 根据这个token获取码的生成时间,保证一定时间后失效。

    2. 同token的码,只能使用一次。

    我试了下在离线状态下生成支付宝的支付码,和微信的支付码,都是退出再生成,码就会变。 基本证实以上想法。

    追加:

    考虑到支付宝的私钥公钥的生成, 我猜测是不是应该在每次登陆时就计算一把,然后上传公钥? 不然登陆后服务器下载自己的私钥岂不是不安全? 那如果是这样, 我前面所说的告知服务器自己使用的设备,就是刚需了, 这样才能让服务器知道用哪个公钥来解密。 (毕竟现在可以手表手机多端登陆。)

    这段猜测比较幼稚, 请大牛打脸指正!

  3. Will Wang
    理由
    举报 取消

    刷题主微博看到题主这个问题=_=,某天在回家路上也想过这个问题

    说个猜想吧。算法比较烂,也从来没研究过密码学,所以说的可能不对。

    反过来想,如果产品突然一天跑来和你说我要抄支付宝微信这个付款码的功能(虽然产品肯定不会直接说抄),要能离线,最简单的怎么做?

    那我直接把该用户的某某唯一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密码值=_=,不过貌似对阿里来说也不算什么。

    请大牛打脸指正

我来回答

Captcha 点击图片更换验证码