二维码支付这些年发展的如火如荼,前两年在另外一个站上也大致分析过二维码支付的原理,年底摸摸鱼,重新整理一下吧。

(说实话我很讨厌有的人借着学习的名义把博客上的文章抄来抄去)

1、数字支付码

数字支付码就是打开微信和支付宝付款界面的那串玩意,通过数字找到对应账户,再从账户里扣钱,就这么一回事。

看起来很简单,实际上这里面的过程就非常复杂了。

大致上要解决的问题有这么几个:

a.随机性

b.识别性

c.可用性

d.安全性

首先,随机性就意味着生成的结果必须是离散的,如果按照序列变化,很容易就会被穷举出来;

其次,识别性就要求通过一串数字能很快的找到对应的账户,这就要求对数据的处理时间不能太长太多;

然后,可用性是说在网络不好的情况下,要允许客户端生成离线序列,不影响支付的可用性;

最后,安全性不说都知道了,要保证一码一账户,不能随便被人随时随地造一个有效的出来;

目前网络上讨论的不外乎两种方案:

第一种,直接生成支付码下发给客户端,完整存储数字序列。但是这依赖着服务端,如果有效期过长会有安全问题,如果有效期太短,又会对数据处理有压力,更可怕的是用户数量上去了,这个量就是一个天文数字。

第二种,基于时间的TOTP算法,但是纯粹这种算法是不能直接识别账户来源的,也就意味着要把所有用户的密钥全部计算一遍才可能知道是谁的,这个数据量,估计算到一半前面的就都过期了。

其实以上的思路都是对的,如果结合在一起就基本上就是实现方案了。

大致上就目前市面上的付款码而言,前1-2位是用于标识这是什么机构的标识头,这是为了方便聚合支付厂商定的,也可以过滤掉非本系统的支付码,例如微信是1开头的,支付宝是2开头的,银联的云闪付是62开头的,这就有些跑马圈地的意思了。未来可以预期的是国家会对这个出国标,不然地圈完了,别人就没法玩了,参考卡bin之类的。

除了标识头以外,接下来的部分大概会分成前半部的【token】或者称之为【随机数】的【挑战码】,而后面一部分几位是类似于【应答值】。这里我们先把随机性的问题解决掉了。

那么如何从几个数字的条码里识别用户?这才是条码支付的核心。

这样就必须提前把身份信息注册到条码里,也就是说客户端在联机的时候,预先向服务器里申请 token,这样某一个 token 被谁申请了,服务器自然就记录了。到这里可识别性就解决了。

当然这还不足,如何鉴权,那就必须在服务器上和客户端里进行相同的操作,取出付款码里的【应答值】和上面token用户的密钥做允许误差范围时间内的计算,如果有符合的结果,即鉴权成功。至于算法是 TOTP 还是HMAC,这个随便了我们并不需要关心。这样即便被人获得token,没有相应的密钥也无法得到正确的【应答值】。这样安全问题和离线可用性的问题我们都也一起解决了。进一步的说,后续还可以通过调整token的可尝试挑战次数、token用后即废等等方式来提高安全性。

接着,我们可能还得预留几位做自己的用途,例如,我选择了哪张卡来支付,我们可以预留一位0-9来标识选的那张卡,但是一位的话意味着只能绑10张卡,那么两位的话又浪费了,要知道条码支付是寸土寸金的,数字长度越长,条码越挤,可识别度就越低(难),手机屏幕就那么大,所以并不是越长越好,将来大家可不想横着展示条码给别人吧!

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

2、离线支付码

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

以上,以后想到什么点子了再加上来。

二维码支付码的工作原理那点事相关推荐

  1. vba二维数组初始化_将工作表数据写入VBA数组

    大家好,最近推出的内容是"VBA信息获取与处理"中的部分内容,这套教程面向中高级人员,涉及范围更广,实用性更强,现在的内容是第四个专题"EXCEL工作表数据的读取.回填和 ...

  2. ZYNQ7000 学习(二十八)C语言二维数组映射到显示器的原理分析以及实现实例 学

    C语言二维数组映射到显示器的原理分析以及实现实例 学习内容 本课将 在上一课的基础上 修改一下 AXI_LITE_SLAVE外设,不再使用寄存 器而直接对 VGA显存里的数据进行进行写操作,达到以数组 ...

  3. QR二维码生成器源码(中间可插入小图片)

    二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...

  4. 一维条码与二维条码的码制区别

    一维条码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 一维条码的应用可以提高信息录入的速度,减少差错率,但是一维条码也存在一些不足之 ...

  5. 医学影像信息系统(PACS源码)基本概况和工作原理

    一.医学影像信息系统(PACS)基本概况 医学影像信息系统(PACS)是一种集影像采集.传输.存储.管理.查询.诊断.报告.归档和科研于一体的综合性应用系统.它基于医学影像存储与通信系统(Pictur ...

  6. xxl-job源码—调度器/执行器工作原理

    目录 一.架构图 1.1 功能架构图 2.2 任务调度工作原理 二.ER图 三.调度器 3.1 启动过程时序图 3.2 启动过程核心代码解析 3.2.1 启动初始化 3.2.2 执行器健康检查 3.2 ...

  7. 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    一.实现方案 对于一个二维图形作平移.旋转.放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移).绕一点旋转固定的角(旋转).在x,y轴方向分别放缩sx ...

  8. 从源码角度分析 Mybatis 工作原理

    作者:vivo互联网服务器团队-Zhang Peng 一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示 ...

  9. (转)spring源码解析,spring工作原理

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring 的骨骼架构 Spring 总共有十几个组件,但是 ...

最新文章

  1. 【论文小技巧】一招搞定论文高速下载
  2. Load data local infile 实验报告
  3. 吴恩达 coursera AI 第三课总结+作业答案
  4. Python数据结构学习笔记——队列和双端队列
  5. 安装上 Octotree 插件让你更加方便的阅读 gitHub 中的代码
  6. 使用Roslyn脚本化C#代码,C#动态脚本实现方案
  7. 分布式精华问答 | 分布式系统面临哪些挑战?​
  8. Windows下资源泄漏检测
  9. 卡巴斯基误杀奇虎360
  10. 如何进行需求优先级管理?
  11. 马云:电商之王还想怎样(转)
  12. (CVPR-2018)Non-local Neural Networks
  13. 用 Python 整理 Excel 表格
  14. 导入sql文件报错:MySQL server has gone away 以及解决方法
  15. haproxy 基本搭建 + 高可用集群的搭建
  16. xd生成html,7款Adobe XD必备插件
  17. sql中将空白值替换为其他值
  18. 计算机科学家尼沃思曾经提出了,2010年江苏省专转本计算机真题含答案
  19. Golang分布式应用之etcd
  20. 经典量化选股方法——没有秘密的多因子

热门文章

  1. 全国计算机等级考试评分标准,全国计算机等级考试评分标准
  2. 计算机社团活动效果取得成绩,电脑社团工作总结
  3. Python连接MySQL insert插入语句
  4. saltstack的NETAPI接口详讲
  5. python饮料购买_Python实现的一个自动售饮料程序代码分享
  6. 元学习:实现通用人工智能的关键!
  7. 【PHP】json返回大括弧和中括弧,json返回{}和[]
  8. templets/default/index.htm Not Found! 图文教程 织梦程序的安装方法
  9. A2SHB规格书,A2SHB如何测试好坏
  10. 雨量传感器测试(大众凌渡高尔夫7雨量传感器)