接口签名实现

接口签名实现,第1张

在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,请求是否唯一,数据是否可以重复提交等问题。其中数据是否被篡改相对重要。

请求携带参数 appid sign ,只有拥有合法的身份appid和正确的签名sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到secret( 仅作本地加密使用,不参与网络传输 ),无法伪造合法的请求。

只使用appid和sign,虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。

nonce指 唯一的随机字符串 ,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。

然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用 timestamp来优化nonce的存储

假设允许客户端和服务端最多能存在10分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在10分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在(说明该请求是第二次请求),则拒绝。否则,记录该nonce,并删除nonce集合内时间戳大于10分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为10分钟)。

对服务端而言,拦截请求用AOP切面或者用拦截器都行,如果要对所有请求进行拦截,可以直接拦截器处理(拦截器在切面之前,过滤器之后,具体在springmvc的dispather分发之后)。

过滤器→拦截器→切面的顺序:

其中,需要放在请求头的字段: appid timestamp nonce signature

对各种类型的请求参数,先做如下拼接处理:

如果存在多种数据形式,则按照path、query、form、body的顺序进行再拼接,得到所有数据的拼接值。

上述拼接的值记作 Y。

X=”appid=xxxnonce=xxxtimestamp=xxx”

最终拼接值=XY。最后将最终拼接值按照一个加密算法得到签名。

虽然散列算法会有推荐使用 SHA-256、SHA-384、SHA-512,禁止使用 MD5。但其实签名这里用MD5加密没多大问题,不推荐MD5主要是因为,网络有大量的MD5解密库。

实现可以分以下几步:

自定义的缓存有body参数的HttpServletRequest:

过滤器中替换自定义的RequestServlet:

添加过滤器的配置以及注意顺序:

由于Zuul自带默认的过滤中,有已经对body处理过的(FormBodyWrapperFilter),所以在Zuul中处理签名,只需添加一个过滤器即可如下。

java接口签名(Signature)实现方案

开放API接口签名验证,让你的接口从此不再裸奔

我们在写微服务的时候每一个请求都是走的微服务的网关,再由网关找到对应的服务,然后传递参数请求数据返回数据,我们通常会在网关对于我们的请求做一些 *** 作,包括请求前以及响应前,这里主要说一下微服务中常用的ZuulFilter过滤器

我们手动去继承ZuulFilter这个类,然后需要我们重写几个方法

这个方法的作用是用来标识这个过滤器在哪个阶段发挥作用,在ZuulFilter源码中是这样描述的

我们这里常用的就是pre,route,post,error,当然还有"static"还有一些自定义的,

这是最开始生效的,这是服务器接收到请求,还没有到达网关的时候生效,我们常用于过滤请求,身份验证什么的,在集群中选择具体的微服务,记录日志之类的信息。

当我们把fifter type设置为route的时候就表示我们的过滤器的生效时间是在我们网关接收到请求但是还没有转发到具体的微服务的时候过滤器生效,用来构建新的请求,比如我们将一些数值信息从token中解析出来存放到我们的请求中,再Apache HttpClient或Netfilx Ribbon请求具体问服务。

这是我们的具体微服务将请求的数据存返回的时候经过的过滤器,比如我们将响应的参数进行加密。

当我们的服务器在接收到请求报错的情况下

这个方法主要是我们在注册过滤器的时候形成过滤链的时候排序使用,这是设置的过滤器的使用顺序

这个方法的功能是用来过滤请求是否需要走下面的具体的run方法,主要是为了区分不同过滤器针对不同的url

这是我们的过滤器的方法主题在这里写我们主要的方法,(解密,token验证,权限验证,重构请求或者响应,解密)

以上就是我们的ZuulFilter的主要的几个方法的讲解,当然别忘了一定要将过滤器放入到spring容器中。

RequestContext context = RequestContext.getCurrentContext():使用这个获取上下文内容主体,

context.setSendZuulResponse(false):用这个方法是设置不在走接下来的过滤器和微服务,直接返回


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11947885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存