• 请不要在回答技术问题时复制粘贴 AI 生成的内容
simplesslife
V2EX  ›  程序员

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

  •  
  •   simplesslife · Oct 10, 2017 · 18879 views
    This topic created in 3145 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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


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

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

    RFC 6238

    标准文档地址。

    我觉得给出这么多资料应该足够了吧。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3312 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 149ms · UTC 11:19 · PVG 19:19 · LAX 04:19 · JFK 07:19
    ♥ Do have faith in what you're doing.