支付流程安全设计

1、总体流程图

2、流程说明:

         由以上流程图可知,整个流程分为:订单生成、支付和后支付验证3个阶段。

2.1、订单生成:

威胁分析:

         该阶段最容易犯的错误是根据前端提交的参数来计算应付款额,比如:相信前端提交过来的产品单价,甚至直接在前端计算应付款额再提交给后台进行处理,这种方式的攻击成本非常低,只需要简单篡改数据即可。正确的做法应当是对物品进行编号,根据前端提交的物品编号和数量来计算应付款额,具体步骤如下:

2.1.1、步骤1:

         为不同的物品生成物品编号,用户在提交订单时,携带用户购买的物品编号和数量信息给后台生成订单,如下图所示:

2.1.2、步骤2:

         电商后台根据用户提交的订单请求参数生成订单数据,其中最重要的一个环节是:根据物品编号和数量计算用户应该支付的款额。即 应付款额=物品编号×购买数量。

2.2、支付:

威胁分析:

         支付阶段基本上是按照第三方支付平台的要求进行接入,通过第三方支付平台的签名和签名验证机制保证支付的安全性,但需要注意的是这些支付平台一般都会提供多种不同的签名机制,比如:RSA和MD5,通过申请签名的步骤可以从中分析出一些风险点。

申请RSA签名步骤:

(1)、申请支付接入。

(2)、生成用于签名的PKI证书,将公钥证书上传到第三方支付平台,并将私钥证书和第三方支付平台的公钥证书保存在自己的服务器。

(3)、使用支付SDK接入并产生支付签名。

申请MD5签名步骤:

(1)、申请支付接入。

(2)、在第三方支付平台上设置签名和验证签名所使用的对称密钥。

(3)、使用支付SDK接入并产生支付签名。

         通过以上对比,两者之间最大的差异在于第2步,即签名所使用的密钥。MD5签名使用的是对称密钥,即双方使用相同的密钥,这意味着密钥的存储安全性由接入方和第三方支付平台共同保证,双方任意一方泄漏了密钥(比如外部攻击和内部泄漏),都将导致支付安全性无法被保证。反之,RSA签名使用的是非对称的密钥,签名用的私钥只保存在接入方的服务器上,第三方支付平台只保存了对应的公钥,即便第三方平台泄漏了接入方的公钥,也不会影响接入方支付的安全性。除此之外,MD5签名的密钥是通常是由用户手动设置而不是随机生成的,用户可能会设置一个足够长度但不够复杂度的密钥,比如:abcd…xyz012..789,因此很可能会被破解。但两者在接入的难度上并无差别,因此,在可能的情况下,建议使用RSA的签名方式,如果使用MD5的签名方式,应使用足够随机复杂的对称密钥。

2.2.1、步骤3(调用支付平台SDK可实现):

         对提交给第三方支付平台的数据进行签名,里面的关键数据包括支付金额等,MD5类型的签名过程如下:

(1)、计算提交参数的签名:

sig= MD5(“amount=389&param1=$val1&param2=$val2&…&paramn=$valn”+MD5key);

(2)、组合提交给第三方支付平台的参数(包括签名和签名类型):

amount=389&param1=val1&param2=val2&…&paramn=valn& sign=$sig&sign_tpye=MD5

RSA类型的签名过程如下:

(1)、计算提交参数的摘要:

hash = MD5(“amount=389&param1=$val1&param2=$val2&…&paramn=$valn”);

(2)、计算提交参数的签名:

sig = RSAsign(hash,RSAprivKey); //此处使用接入方自己的私钥签名

(3)、组合提交给第三方支付平台的参数(包括签名和签名类型):

amount=389&param1=val1&param2=val2&…&paramn=valn& sign=$sig&sign_tpye=RSA

2.2.2、步骤4:

         将步骤3组合的参数通过用户浏览器重定向到第三方支付平台,以此告知用户实际应付的款额。由于需要经过用户客户端跳转,因此,用户是能够对提交的参数数据进行篡改的(比如篡改金额),由于提交参数经过了签名,篡改参数将导致支付平台验签失败而无法支付成功,但基于以上支付的威胁分析,如果使用的MD5签名密钥因复杂度低可被暴力破解或者密钥通过第三方平台泄漏,那么攻击者就可以在篡改数据后重新计算签名值,成功实施攻击。

2.2.3、步骤5:

         由第三方平台实现的签名验证,略。

2.2.4、步骤7(调用支付平台SDK可实现):

         用户支付成功后,将调用接入方在第三方支付平台上设置的回调接口,告知接入方用户支付成功,为保证该接口调用过程中数据没有被篡改以及请求没有被伪造,需要进行数据签名验证,MD5类型的签名验证如下:

(1)、获取来自第三方支付平台的请求参数:

param1=val1&param2=val2&…&paramn=valn& sign=$sig&sign_tpye=MD5

(2)、计算请求参数的签名:

sigLocal= MD5(“param1=$val1&param2=$val2&…&paramn=$valn”+MD5key);

(3)、对比两者签名sign和sigLocal是否一致

RSA类型签名验证如下:

a)       获取来自第三方支付平台的请求参数:

param1=val1&param2=val2&…&paramn=valn& sign=$sig&sign_tpye=RSA

b)       计算请求参数摘要:

hash = MD5(param1=val1&param2=val2&…&paramn=valn)

c)       计算请求参数签名:

sigLocal = RSAversign($sig,RSA3rdPubKey); //注意此处使用第三方支付平台公钥验签

d)       对比两者签名sign和sigLocal是否一致。

2.3、后支付验证(待确认):

威胁分析:

         通过步骤4的分析可知,如果接入方的密钥已经泄漏,那么攻击者就可以任意篡改订单数据和生成签名,因此需要进行一次反向验证(或者由支付平台回调告知),确保支付平台已支付的金额和接入方订单数据内的预期金额是一致的,如果不一致表示该订单存在异常,应予以作废处理,这样也符合产品纵深防御的安全设计。

2.3.1、步骤8:

(1)、接收并处理来自第三方支付平台的支付成功回调。

(2)、根据流水号去第三方支付平台查询实际支付金额(或由支付平台回调告知)。

(3)、对比接入方的预期支付金额与实际支付金额是否一致

注:此过程同样需要签名和验签。

时间: 2024-10-23 18:30:50

支付流程安全设计的相关文章

iOS 微信支付流程详解

背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支付宝支付都是非常简单的,因为第三方的支付文档非常详细,而且他们内部的安全性也非常高.作为使用这些支付策略的我们,只需要掌握流程,能够实现正常支付的功能即可.为什么要写下这篇博文,原因有二.其一,微信支付流程中有坑,其二,以后忘记了可以拿出来看看. 配置 1.微信支付需要两个账号,财付通和微信开发者,

iOS app集成支付宝支付流程及后台php订单签名处理

iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付宝开通无线支付功能 开通商户支付宝之后,虽然可以获取到应用使用的 key和id,如果如果不开通无线支付功能的话,会在app集成的时间 提示商户未开通无线支付功能的错误: 开通商户支付宝-无线支付功能,请在商户支付宝后台,按要求提供审核材料开通: 3:在商户支付宝后台下载SDK 在商户支付宝后台,即可

易宝支付流程

1. 获取易宝的API 获取API的第一步,要在易宝上注册一个账号,这个账号是商家的账号,后面买家付款后,会将钱款存入该账号中,然后商家自己提取到银行卡,易宝在提取过程中收取一定的手续费.这就是易宝的盈利模式.但是注册成功需要前提,那就是自己得有一个网站,或者是一个公司,吧啦吧啦等东西,反正就是你得有资格申请,这点易宝会审核的,满足了才会允许你注册,才会给你提供他们的接口,不是所有人都可以注册的.我用的也是别人注册好的,我自己啥也没有……也没法注册……屌丝一个,大家懂的~但是一般在公司里开发的话

微信支付流程(IOS)

微信支付流程(IOS) 1.注册微信开发账号,开通支付权限(注册谁都会了) 2.把三个文件拉进去 libWeChatSDK.a WXApi.h WXApiObject.h 3.添加URL Types 4.AppDelegate.m中添加微信账号 [WXApi registerApp:@"wxalsdfjalsfals" withDescription:@"tencent"]; 回调 - (BOOL)application:(UIApplication *)appli

微信开发——熟悉支付流程

支付环境搭建好后,就要开始熟悉官方的微信支付相关接口了.微信支付这块的文档还是比较全面并简而易懂 的,其实想想也是应该的,腾讯有了微信电商想法,就有了支付这一考虑,财付通的用户量及用户喜好程度是有目共 睹的,支付宝这种方式深受广大网民喜欢,但腾讯会用支付宝在微信上吗,绝对不可能的啊.要能让用户在微信上不 仅能轻而易举的开着微信小店,简单快捷的微信支付方式就油然而生了. 开通商户功能后,可按以下步骤完成商户和微信的对接: 1.生成商品消息:通过接口或者登录公众平台网站,根据商户网站的商品网页生成对

支付宝支付流程

支付宝支付流程 支付宝给的流程图还是很清晰的,其实基本流程就是 用户向服务器请求一个付款 服务器生成一个带签名的订单发送给客户端 客户端通过这个订单向app sdk请求付款 sdk把用户引入支付宝付款界面进行支付 支付成功后支付宝向前端返回支付成功结果,并且向服务器发送一个支付通知 服务器接收通知并且验证是否是支付宝发送的成功结果 app客户端需要做的很简单: 向自己的服务器请求一个订单, 接收到订单后,向支付宝sdk发情一个支付请求 交易结束后返回一个成功或者失败 服务器做的事情稍微多一点(注

【深度解析】第三方支付的分类、接口与支付流程

原标题:[深度解析]第三方支付的分类.接口与支付流程 目录 - - - - - 1. 概述 2. 支付环节 3. 分类 4. 银行接口 如今第三方支付已经发展的非常成熟,但是至今仍未有一个比较权威的定义,下面将根据自己的工作经历说明一下第三方支付,文章有点长. 1 概述 第三方支付是具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,提供与银行支付结算系统接口的交易支持平台的网络支付方式. 第三方支付平台是指平台提供商通过通信.计算机和信息安全技术,在商家和银行之间建立连接,从而实现消费

如何对软件支付流程进行测试?才能更安全的买买买!

现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能.比如:做商城的,做游戏的以及其他在线交易的网站.APP等.如果支付出了问题,或者用户拿少的钱通过篡改请求数据购买大金额的商品,如果是实物的话,发货前还有可能被发现.如果是虚拟商品话费.游戏币等就有可能造成损失. 所以,不管是实物也好,虚拟商品也好,涉及到支付功能时,大家在测试的过程中一定要重视,否则,会造成很大损失. 前几天也有小伙伴在评论区留言问我:支付这一块如何进行测试? 那我们今天就来说说支付流程的测试点,废话不多说,来进入我们今

在线支付流程安全分析与支付漏洞总结

前言 大家对支付漏洞的理解通常都是篡改价格,已有的对支付漏洞的总结也是对现有的一些案例的经验式归类,没有上升到对在线支付流程深入分析的一个层面.这里尝试从分析在线支付流程,在线支付厂商的接入方式开始,深入业务分析整个在线交易流程中容易出现的安全问题. 支付宝/在线支付流程 支付宝即时到账接口开发流程 在线支付从功能上来说是通过支付宝的支付渠道,付款者直接汇款给另一个拥有支付宝账号的收款者.整个流程说明如下:引用自支付宝文档. (1)构造请求数据商户根据支付宝提供的接口规则,通过程序生成得到签名结