V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
simplesslife
V2EX  ›  程序员

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

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

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

    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 个窗口的摘要,如果有一致的,认为是你本人。
    Humorce
        6
    Humorce  
       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  
       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   ·   实用小工具   ·   2608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:22 · PVG 14:22 · LAX 22:22 · JFK 01:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.