Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >聊聊数字签名(下)

聊聊数字签名(下)

作者头像
一个无聊的人
发布于 2022-08-26 01:51:16
发布于 2022-08-26 01:51:16
1K0
举报

前言

上篇文章浅尝辄止,想了一个场景来讲述对称密钥以及非对称密钥解决了什么问题,以及各自有什么优缺点,本文用实际的案例来分析签名能解决什么问题,以及该如何正确的签名。

案例分析

阅读了支付宝、微信支付、腾讯云、阿里云的开放文档,发现他们签名方式几乎一致,在不同的场景分别使用MD5和数字证书签名,甚至在不同的时间节点进行相同类型的升级,下面是我各大平台的开放文档中找到的作为案例分析。

MD5签名

下面是我从支付宝平台找到的一个文档,我们先看MD5签名方式,通过阅读文档知道使用MD5哈希步骤如下:

1)筛选:获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign与sign_type参数。

2)排序:将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

3)拼接:将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。MD5签名的商户需要将key的值拼接在字符串后面,调用MD5算法生成sign。

那么按照以上过程,我们可以拼出如下签名原传,其中signkey是商户和支付宝约定的签名key, 对该串求md5,形成签名:

out_trade_no=2012113000001&total_fee=0.01&signkey=XXX

由于MD5不可逆的特点,攻击者并不知道signkey,因此也就无法计算签名,同时如果攻击者修改了参数,后台服务在校验签名时就会提示签名错误,不予处理,达到了请求方身份校验和保证参数不被更改的目的

但是细心的话应该可以发现,腾讯云、阿里云等各大平台的开发文档中,几乎所有使用这种签名方式的接口都会要求传入另外两个参数,nostr和timestamp,nostr是一个随机字符串、timestamp是unix时间戳,这又是为什么呢?

先说结论:为了防止重放攻击,https可以解决传输层面的安全问题,但不能解决应用层面的安全问题

比如某一个接口是文件下载接口,攻击者尽管不知道你的signkey,可是他可以把你的签名串以及参数记下来,然后疯狂请求服务器,这样服务器校验签名依然通过,需要耗费巨大的资源来处理攻击者海量的恶意请求,从而影响服务。

现在我们再来看这两个参数,很多地方说nostr是用来增加签名的不可预测性,但是我认为这是不正确的,在signkey没有泄漏的情况下,由于MD5的特性,任何人都无法仿冒签名或者预测签名

为了规避重放攻击,我们很容易就想到在每个请求中增加一个随机字符串,这样当服务器每处理完一个请求就会把这个字符串记下来,下次再有相同请求相同nostr就不予处理,从而防止重放攻击,然而随着请求越来越多,需要缓存的nostr也越来越多,显然服务器不可能永久的缓存nostr,然而一旦删掉请求过的nostr就意味着攻击者又可以使用这部分nostr进行攻击了,于是又加了timestamp。我们给签名设置了一个有效期,在每次请求处理前先校验签名,签名通过后校验timestamp确认签名是否过期,这样服务器既不需要缓存nostr,又解决了重放攻击问题。

这里再额外说一下为什么需要nostr和timestamp两个参数来解决重放攻击问题:

1)假如只有nostr服务器就需要永久的缓存使用过的nostr,这个存储成本以及检索效率都是问题;

2)假如只有timestamp,在并发情况如果很有可能同一时间有两个相同参数的请求都是有效的,但服务会错误的认为是重放攻击从而仅处理第一个。

MD5签名方式可以应用在大多数场景,完全可以满足鉴权和参数校验的需求,然而支付场景有更高的安全要求,我们再来分析MD5有什么安全问题:

1)无法防御跨接口攻击,在restful标准下同一资源的不同操作url、参数很可能相同,仅请求方法不同;

2)使用对称密钥签名,无法防抵赖,因为是双方持有签名key,一旦发生安全问题,无法确定是哪一方的责任。

3)没有对参数转移,可能导致不同请求做出的签名相同,比如某一个参数的值是“tom&key=1”

证书签名

在涉及到支付,比如扣款、退款等接口,支付宝和微信支付的开放文档都是使用了更为严格的签名方式,签名的内容也不再仅对参数进行校验,下面是微信支付升级后的签名内容(支付宝也类似,有微小区别):

签名串一共有五行,每一行为一个参数。行尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n。

1:HTTP请求方法\n 2:URL\n 3:请求时间戳\n 4:请求随机串\n 5:请求报文主体\n

其签名方式也不再是使用MD5,而是使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。

与MD5签名方式相比较:

1)请求方法和url参与签名可以解决跨接口攻击;

2)请求时间戳和请求随机串参与签名可以解决重放攻击;

3)请求报文主体不再是拼接字符串,而是json格式,可以解决不同请求签名相同的问题;

4)使用证书签名,证书持有者仅商户自己,可以防抵赖。

在阅读支付宝和微信支付的文档时,发现两家都对证书进行过一次升级,由原来使用的自签名升级为第三方可信机构颁发的证书,原因有两个:

1)国家相关标准规定 “电子签名需要第三方认证的,由依法设立的电子认证服务提供者提供认证服务。”(还记得12306的那个安全提示吗,就是因为之前12306使用的也是自签名),因此申请了第三方可信机构的证书,然后使用这个证书为每个商户签发证书;

2)自签名有安全隐患;只要理解了签名的原理,任何人都可以按照教程生成证书,做证书并不难,难的是发挥它该有的作用。但是还记得上篇中讲到数字证书出现的原因吗,是为了解决中间人攻击问题,它能够解决中间人攻击的原因正是因为证书颁发机构是可信的,但是如果使用了自签名,签名机构是没有经过认证的,也就是不可信的,一切又回到了原点。

支付场景对安全性有着更高的要求,自从做了支付小心翼翼、如履薄冰。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
公司来了个大神,三方接口调用方案设计的真优雅~~
在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。
程序员蜗牛
2024/04/22
2.3K0
公司来了个大神,三方接口调用方案设计的真优雅~~
HTTPS协议
众所周知,HTTP协议是直接进行明文传输的,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,因此通信过程非常容易遭遇劫持、监听、篡改。严重情况下,会造成恶意的流量劫持。
Liusy
2022/01/11
7340
HTTPS协议
电商系统中API接口防止参数篡改和重放攻击(小程序/APP)
来源:https://www.cnblogs.com/jurendage/p/12886352.html
良月柒
2021/01/25
1.4K0
电商系统中API接口防止参数篡改和重放攻击(小程序/APP)
Java中的微信支付(1):API V3版本签名详解
最近在折腾微信支付,证书还是比较烦人的,所以有必要分享一些经验,减少你在开发微信支付时的踩坑。目前微信支付的 API 已经发展到V3版本,采用了流行的 Restful 风格。
码农小胖哥
2020/10/30
1.9K0
Java中的微信支付(1):API V3版本签名详解
Java中的微信支付(1):API V3版本签名详解
1. 前言 最近在折腾微信支付,证书还是比较烦人的,所以有必要分享一些经验,减少你在开发微信支付时的踩坑。目前微信支付的 API 已经发展到V3版本,采用了流行的 Restful 风格。 微信支付V2与V3的区别 今天来分享微信支付的难点——签名,虽然有很多好用的 SDK 但是如果你想深入了解微信支付还是有帮助的。 2. API 证书 为了保证资金敏感数据的安全性,确保我们业务中的资金往来交易万无一失。目前微信支付第三方签发的权威的 CA 证书(API 证书)中提供的私钥来进行签名。通过商户平台你可以设置
程序猿DD
2023/04/04
2K0
Java中的微信支付(1):API V3版本签名详解
支付宝接口的数字签名
某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将 “签名字符串 sign” 作为通知参数发送给商户系统。支付宝签名的步骤是:
真正的飞鱼
2023/01/30
6100
大厂案例 - 通用的三方接口调用方案设计(上)
在为第三方系统提供接口时,关键是确保数据的完整性、安全性和防止重复提交。以下是一个基于API密钥(Access Key/Secret Key)和回调机制的设计方案,具有多层次的安全保障。
小小工匠
2024/05/26
4K0
大厂案例 - 通用的三方接口调用方案设计(上)
这面试题我遇到过,两次。
印象比较深的是第一次遇到这个面试题的时候,也是第一次听到“重放攻击”这个词的时候,一脸蒙蔽,于是我就连蒙带猜的,朝着接口幂等性的方向去答了。
why技术
2021/06/10
5010
这面试题我遇到过,两次。
这才叫 API 接口设计!
大家好,我是鱼皮,前段时间在 星球 里看到了一位小伙伴分享的文章《API 接口设计最佳实践》,我也读了一遍,写的确实好,给大家分享一下,相信对后端开发的小伙伴会很有帮助。
程序员鱼皮
2022/04/08
2.8K0
这才叫 API 接口设计!
Java支付宝接口开发【面试+工作】
Java支付宝接口开发【面试+工作】 最近公司在做支付模块,在接入过程中遇到了很多坑,费了不少事,现在分享一下接入方法,也记录一下,以后可能还用的到。用的是支付宝的即时到帐支付功能和微信的扫码支付功能,相比起来,个人感觉支付宝的文档和接入方式都比微信的容易理解和操作,也不用自己写页面,接入起来比较方便,毕竟是支付起家的,比微信支付少很多坑,下面就分别介绍着两种支付的接入方法。 支付宝支付 1、申请签约 目的是得到开发使用的合作伙伴身份(PID)和MD5秘钥,申请地址(即时到账收款):https://b.al
Java帮帮
2018/03/15
2.5K0
Java支付宝接口开发【面试+工作】
iOS 微信支付开发(更新版)
本文为以前做的项目总结,由于相关支付 SDK 迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。
网罗开发
2021/01/29
1.2K0
iOS 微信支付开发(更新版)
谈谈微信支付曝出的漏洞
昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为,其中就包括众多媒体所宣传的“0元也能买买买”。
美的让人心动
2018/07/30
9980
谈谈微信支付曝出的漏洞
保证接口数据安全的10种方案
我们日常开发中,如何保证接口数据的安全性呢?个人觉得,接口数据安全的保证过程,主要体现在这几个方面:一个就是数据传输过程中的安全,还有就是数据到达服务端,如何识别数据,最后一点就是数据存储的安全性。今天跟大家聊聊保证接口数据安全的10个方案。
捡田螺的小男孩
2023/02/24
1.4K0
保证接口数据安全的10种方案
我所理解的接口设计
前言 自己做接口开发的时间也算不短了(三年),想写这篇文章其实差不多已经有一年多的时间了。我将从下面的方向来对我所理解的接口设计做个总结: 接口参数定义 -> 接口版本化的问题 -> 接口的安全性 -> 接口的代码设计 -> 接口的可读性 -> 接口文档 -> 我遇到的坑 接口参数定义 接口设计中往可以抽象出一些新的公共参数,从事了近三年的接口开发工作中,我目前能想到了一些较为常见的公共接口参数如下: 公共参数含意定义该参数的意义timestamp毫秒级时间戳1.客户端的请求时间标示 2.后端可以做请求过期
前端教程
2018/03/29
7170
浅谈移动支付测试
现在在线支付是微信钱包和alipay的天下,不管你是买瓶水,还是买个大件电器,都可以在线支付解决。不仅支付方便快捷,而且不用找零。
赵云龙龙
2019/10/08
2.4K0
浅谈移动支付测试
SpringBoot 如何保证接口安全?老鸟们都是这么玩的!
对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。 如果你的接口在外网裸奔,只要让黑客知道接口的地址和参数就可以调用,那简直就是灾难。
闻说社
2023/03/13
1.4K0
Android 微信支付开发流程
项目中要用到支付功能,需要支付宝支付、微信支付、银联支付,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。 今天我们就主要介绍一下微信支付,其他支付也写了对应教程,并且给出了连接。
网罗开发
2021/01/29
2.7K0
Android 微信支付开发流程
python自行实现支付宝证书签名&验签全流程[通俗易懂]
这里不得不吐槽下支付宝文档,自行实现签名全给的是参考java sdk实现,网上证书签名和验签文章也没几篇。这里给大家分享下自己实现的全过程,希望能够避免大家少踩点坑。 最后ps:若是支付宝官方觉得我这篇python自行实现支付宝证书签名和验签可以给用户当做参考的话,拿走不谢,哈哈!!!
全栈程序员站长
2022/08/26
1.4K0
API接口签名验证,你学废了吗
为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。
Java技术精选
2021/08/16
2.7K0
一篇文章解锁微信支付
随着微信小程序的发展,越来越多的移动端应用选择了微信产品作为媒介。无论是公众号开发还是小程序开发,微信支付永远都是绕不开的话题。由于微信支付涉及了很多场景,本文我们只学习如何在公众号、小程序中接入微信支付。
Java旅途
2021/09/24
1.4K0
推荐阅读
相关推荐
公司来了个大神,三方接口调用方案设计的真优雅~~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档