微信和支付宝的脱机二维码实现原理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
simplesslife
V2EX    程序员

微信和支付宝的脱机二维码实现原理?

  •  
  •   simplesslife 2017-10-10 16:00:52 +08:00 18515 次点击
    这是一个创建于 2990 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信和支付宝没联网情况下都可以展示二维码付款,大家说说这是什么原理?

    44 条回复    2017-10-11 12:18:04 +08:00
    explon
        1
    explon  
       2017-10-10 16:02:47 +08:00   2
    原理类似离线的 RSA
    simplesslife
        2
    simplesslife  
    OP
       2017-10-10 16:05:39 +08:00
    @explon 啥意思哦
    hjc4869
        3
    hjc4869  
       2017-10-10 16:06:43 +08:00
    基于时间的
    caixiexin
        4
    caixiexin  
       2017-10-10 16:16:34 +08:00 via Android
    如果让二维码的失效时间长一点,再加一些其他限制,是不是就类似脱机二维码了?
    paw
        5
    paw  
       2017-10-10 16:17:45 +08:00   1
    简单上可以理解为 HMAC ( token,时间戳) 计算出的摘要。
    token 是在有网络登录时服务器下发的,可能会每次联网都更新,时间戳是按 2 分钟左右窗口对齐过的值。
    服务器拿到离线码后,计算下当前时间前后 2-3 个窗口的摘要,如果有一致的,认为是你本人。
    rzti483NAJ66l669
        6
    rzti483NAJ66l669  
       2017-10-10 16:18:17 +08:00 via Android
    密保卡原理
    ColinZeb
        7
    ColinZeb  
       2017-10-10 16:20:07 +08:00
    原理参考 MFA
    ColinZeb
        8
    ColinZeb  
       2017-10-10 16:20:58 +08:00
    @caixiexin 这就很危险了,付款二维码时间长了有弊无利。
    simplesslife
        9
    simplesslife  
    OP
       2017-10-10 16:23:16 +08:00
    @ColinZeb MFA google 没搜到,是什么意思?
    ss098
        10
    ss098  
       2017-10-10 16:31:21 +08:00
    在本地存储一个密钥,这个密钥在一定时间内可用,每次需要用的时候就生成一个二维码。
    ColinZeb
        11
    ColinZeb  
       2017-10-10 16:54:29 +08:00
    @simplesslife https://en.wikipedia.org/wiki/Multi-factor_authentication
    其实我想说的就是两步验证的密钥
    BBCCBB
        12
    BBCCBB  
       2017-10-10 17:05:35 +08:00
    你离线,商家得在线才能使用!!!
    BBCCBB
        13
    BBCCBB  
       2017-10-10 17:06:07 +08:00
    simplesslife
        14
    simplesslife  
    OP
       2017-10-10 17:30:26 +08:00
    @BBCCBB 666
    jiangzhuo
        15
    jiangzhuo  
       2017-10-10 17:37:39 +08:00
    扫码的得在线啊。
    byuan04
        16
    byuan04  
       2017-10-10 18:39:38 +08:00
    别的没啥事 我就想支持 apple watch 3 啥时候能支持离线, 一代能支持, 三代到现在还提示不支持
    shiye515
        17
    shiye515  
       2017-10-10 19:10:19 +08:00 via iPhone
    @byuan04 apple watch 上支付宝的二维码可以离线
    opengps
        18
    opengps  
       2017-10-10 19:16:33 +08:00
    二维码离线了,但是扫码枪没离线啊
    CZ
        19
    CZ  
       2017-10-10 19:22:12 +08:00
    跟你的信用卡一样,你的信用卡也不会上网,刷卡机联网!
    clino
        20
    clino  
       2017-10-10 19:43:32 +08:00 via Android
    不就应该是包含一个账户信息吗?
    为什么要密钥?
    sky0009
        21
    sky0009  
       2017-10-10 19:48:58 +08:00 via Android
    @clino 账户连加密都不要的吗?逗我?
    tadtung
        22
    tadtung  
       2017-10-10 19:52:20 +08:00
    这东西其实类似于两部验证,,只是微信和支付宝将数字密码信息用二维码展示。。。
    楼上有人说 HMAC,,的确是这样的。
    我想你应该用过 google 的两步验证,或者暴雪的游戏验证器。。
    想详细了解的话,建议自己去看 google 的开源代码,,或者也有不少开源的其他验证源码。
    realpg
        23
    realpg  
    PRO
       2017-10-10 20:10:08 +08:00
    @opengps #18
    有双离线的,二维码公交卡就是……
    扫码枪端不是实时在线 一定算法初步脱机判定合法就给通过 后续延迟扣款
    clino
        24
    clino  
       2017-10-10 20:43:32 +08:00
    @sky0009 为什么帐户信息需要保密?
    类比很早以前原始的网购就是给一个银行帐号,然后你给这个帐号汇款
    当然这只是一个类比,也可以用一个帐号的哈希值,支付宝或者微信可以根据这个值查到对应的帐户就行了吧,这个过程并不需要加密
    keniusahdu
        25
    keniusahdu  
       2017-10-10 20:43:59 +08:00
    TOTP 算法啊
    jyf
        26
    jyf  
       2017-10-10 20:51:11 +08:00
    基于公钥密钥加密的话完全可以啊
    tinkerer
        27
    tinkerer  
       2017-10-10 21:17:29 +08:00
    @keniusahdu 我也觉得是基于时间的
    wr410
        28
    wr410  
       2017-10-10 21:32:48 +08:00   2
    简单说吧!

    条码支付其实格式上是有潜规则的,基本上是前 2 位用来识别这个条码属于哪个支付公司的。因为有很多聚合支付的商户,具体举例:麦当劳、全家,统一入口扫码,自动路由去请求支付授权。

    所以,第一种,商户联机核销的条码。这种条码除了标识头以外,中间大概会分成 token 类似于挑战码,后面几位应该是类似于应答值。

    上面有人说的一次性口令的实现其实是不严谨的,因为单纯一次性口令的前提是必须知道对方的身份。否则,给你一串条码你去几亿用户里比对?

    那么如何从几个数字的条码里识别用户?这才是条码支付的核心。那么就必须提前把身份信息注册到条码里,也就是说客户端在联机的时候,预先向服务器里申请 token,这样某一个 token 被谁申请了,服务器自然就记录了。当然这还不足,如何鉴权,那就必须在服务器上和客户端里进行相同的操作,无论是 HMAC 还是预共享密钥,这个随便了,得出的结果就是后面几位的应答值。

    当然,十来位的条码肯定是不足的,那么 token 段必然是多用户共享的,也就是一个 token 是可能被多个用户一起注册的,但是我们可以从 token 里知道有哪些用户在用,然后通过检索每个用户的应答值就可以完成鉴权动作了。所以这里就存在一个风险,一个 token 最大同时共享给多少人可以控制在可接受的风险范围?这些就是数学问题啦。

    第二种,双方离线的二维码。

    这个其实就是和公交卡一样的原理,感觉没什么可说的。大家有共同的密钥或者基于 PKI 的鉴权,生成账户支付码(无外乎就是金额、账号之类的,需要时效性就再加一个有效期),设备检查通过就可以了。反正要预先充钱,事后再记账罢了。


    以上均为个人想法,欢迎探讨。
    HYSS
        29
    HYSS  
       2017-10-10 21:41:01 +08:00
    你听说过支票么?
    johnnie502
        30
    johnnie502  
       2017-10-10 21:54:32 +08:00
    @clino 大家都说的是付款方信息加密,你说的是收款方信息公开,这是两回事。付款方信息当然要加密了,不然丢失之后就会被人恶意支付
    cnkuner
        31
    cnkuner  
       2017-10-10 22:05:04 +08:00 via Android
    根据时间戳、手机串号等和特定密钥或者算法算出一串值,然后生成二维码,拿这个值和服务器算出的比对,如果正确,就通过。
    类似将军令、QQ 令牌、动态密码这种。大概原理应该就这种,至于具体的方式和细节(比如时间校对之类的)没有深入研究过。
    clino
        32
    clino  
       2017-10-10 22:40:51 +08:00
    @johnnie502 明白了,我误解了...
    那应该是楼上说的那种预先申请好的一次性的付款 token 之类的,然后由收款方拿着发往服务端,因为收款方肯定要能联网
    157003892
        33
    157003892  
       2017-10-10 23:23:08 +08:00 via iPhone
    有一个此项技术的重度应用,将军令,安全又快捷
    ETiV
        34
    ETiV  
       2017-10-10 23:48:51 +08:00 via iPhone
    其实最大的问题是要解决海量用户下的碰撞问题

    否则某次支付的时候,被刷走了别人的钱,这种公司迟早倒闭
    Tony2ee
        35
    Tony2ee  
       2017-10-11 00:44:52 +08:00 via Android
    参考银行的网银令牌
    sobeau
        36
    sobeau  
       2017-10-11 04:55:48 +08:00
    @ETiV 二维码信息里包含用户识别码不就好了么
    Chieh
        37
    Chieh  
       2017-10-11 09:01:37 +08:00 via Android
    类似信用卡 信用卡也不用联网
    whatTheGhost
        38
    whatTheGhost  
       2017-10-11 10:46:37 +08:00
    @clino 不加密我知道你的支付宝账户,自己生成一个二维码,随便刷。
    clino
        39
    clino  
       2017-10-11 10:57:20 +08:00
    @whatTheGhost 我之前说的是不加密自己的收款方信息,这样的二维码你刷了是要往这个帐户里转钱吗?
    Neveroldmilk
        40
    Neveroldmilk  
       2017-10-11 11:00:14 +08:00
    这跟银联刷卡一个意思吧。你离线,商家在线就行。
    JerryCha
        41
    JerryCha  
       2017-10-11 11:52:25 +08:00
    基于时间戳的 token,但一定得有一方在线的
    whatTheGhost
        42
    whatTheGhost  
       2017-10-11 12:02:52 +08:00
    @clino 你说的是你刷别人的二维码付款,题主说的是用自己的二维码付款。OK ?
    xomix
        43
    xomix  
       2017-10-11 12:16:23 +08:00
    技术搜索关键字 TOTP,有没有标准化的文档我忘记了,你自己用这个关键字丰富技术内容吧
    xomix
        44
    xomix  
       2017-10-11 12:18:04 +08:00
    https://tools.ietf.org/html/rfc6238

    RFC 6238

    标准文档地址。

    我觉得给出这么多资料应该足够了吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1008 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:39 PVG 02:39 LAX 10:39 JFK 13:39
    Do have faith in what you're doing.
    ubao msn 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