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

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

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

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

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

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

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

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

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

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

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

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


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

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

    RFC 6238

    标准文档地址。

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