在线支付业务最佳实践

目录 SOLUTION

之前看到一个支付漏洞,客户端会对几个重要参数做签名,签名hash算法使用md5,salt会从Server获取。测试时分析数据包发现key字段即salt,然后fuzz出签名的参数组合。一直在想解决方案,和最佳实践,终得解。

一般在线支付分为2个阶段:

1、Client在电商Server上生成订单

2、电商Server向支付Server请求签名的key

3、Cient点击支付后跳转到支付Server上进行支付

NewImage

这2步可能存在很多风险,如商品数量改为负数、订单金额篡改等等,此文主要讲解决方案,风险点暂不深入。

为保证完整性和不可重放,可采用如下架构:

NewImage

此架构涉及6步,下面对每步的流程进行梳理:

1、Client将商品编号、商品数量、时间戳发送给电商Server

2、电商Server向支付Server请求一个key

3、支付Server返回给电商Server key,电商Server通过图示算法对key和goodId、amount、timestamp生成签名

4、电商Server返回给Client一段重定向的URL,包含message和sign

5、Client将message和sign发送给支付Server,支付Server通过message和第3步生成的key再次生成签名,与sign比对,以校验完整性

6、返回支付结果

以上为业务流程,还有几点需要说明:

1、时间戳timestamp用作防御重放攻击,支付Server在收到支付请求时会比对是否超时,如果超时则请求失败

2、电商Server需对商品数量进行校验,必须为正整数

3、总额由服务端通过商品编号和商品数量计算所得,而不用从客户端算得的总额

4、sign=sha(message+salt)这一步要把salt放在message后面,防止哈希长度扩展攻击

以上为大致架构,一些细节未深入或已简化。

此架构保证了完整性和不可重放,但并未保证机密性,还需在传输层进行加密,或对整个请求进行加密。

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注