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

2017-10-10 16:00:52 +08:00
 simplesslife

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

17634 次点击
所在节点    程序员
44 条回复
sky0009
2017-10-10 19:48:58 +08:00
@clino 账户连加密都不要的吗?逗我?
tadtung
2017-10-10 19:52:20 +08:00
这东西其实类似于两部验证,,只是微信和支付宝将数字密码信息用二维码展示。。。
楼上有人说 HMAC,,的确是这样的。
我想你应该用过 google 的两步验证,或者暴雪的游戏验证器。。
想详细了解的话,建议自己去看 google 的开源代码,,或者也有不少开源的其他验证源码。
realpg
2017-10-10 20:10:08 +08:00
@opengps #18
有双离线的,二维码公交卡就是……
扫码枪端不是实时在线 一定算法初步脱机判定合法就给通过 后续延迟扣款
clino
2017-10-10 20:43:32 +08:00
@sky0009 为什么帐户信息需要保密?
类比很早以前原始的网购就是给一个银行帐号,然后你给这个帐号汇款
当然这只是一个类比,也可以用一个帐号的哈希值,支付宝或者微信可以根据这个值查到对应的帐户就行了吧,这个过程并不需要加密
keniusahdu
2017-10-10 20:43:59 +08:00
TOTP 算法啊
jyf
2017-10-10 20:51:11 +08:00
基于公钥密钥加密的话完全可以啊
tinkerer
2017-10-10 21:17:29 +08:00
@keniusahdu 我也觉得是基于时间的
wr410
2017-10-10 21:32:48 +08:00
简单说吧!

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

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

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

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

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

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

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


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

否则某次支付的时候,被刷走了别人的钱,这种公司迟早倒闭
Tony2ee
2017-10-11 00:44:52 +08:00
参考银行的网银令牌
sobeau
2017-10-11 04:55:48 +08:00
@ETiV 二维码信息里包含用户识别码不就好了么
Chieh
2017-10-11 09:01:37 +08:00
类似信用卡 信用卡也不用联网
whatTheGhost
2017-10-11 10:46:37 +08:00
@clino 不加密我知道你的支付宝账户,自己生成一个二维码,随便刷。
clino
2017-10-11 10:57:20 +08:00
@whatTheGhost 我之前说的是不加密自己的收款方信息,这样的二维码你刷了是要往这个帐户里转钱吗?
Neveroldmilk
2017-10-11 11:00:14 +08:00
这跟银联刷卡一个意思吧。你离线,商家在线就行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396503

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX