前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >还在手动对参数进行签名校验?太落后了吧!

还在手动对参数进行签名校验?太落后了吧!

作者头像
猿天地
发布2020-11-04 09:53:18
9440
发布2020-11-04 09:53:18
举报
文章被收录于专栏:猿天地猿天地

有做过开放平台的同学肯定知道,对外的 API 都要做签名校验,防止重放等来保证安全性。既然是统一的校验,那就没必要让每个开发接口的同学都去手动的进行校验,这个时候我们需要统一进行签名的校验和重放的校验。

今天给大家推荐一个 API 校验的框架,通过注解和切面的方式自动进行签名校验,并且支持自定义算法,使用简单,我强调一下,大家如果要用于自己的项目中,可以下载源码稍微改造下,因为我觉得还有些地方没有处理好,当然大家可以借鉴这个项目的思路,还是不错的。

集成框架

可以直接使用作者已经上传了的 jar 包,当然你也可以自己下载源码编译。

代码语言:javascript
复制
<dependency>
    <groupId>cn.oever</groupId>
    <artifactId>api-signed</artifactId>
    <version>0.0.1</version>
</dependency>

添加配置信息,主要配置加密算法和 Redis 信息,因为这个项目用到了 Redis 做防止重放。

代码语言:javascript
复制
server:
  port: 8080
oever:
  signature:
    time-diff-max: 300
    algorithm: HmacSHA1
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

time-diff-max:调用方与服务器时间戳允许的最大差值,单位秒,默认值 10 秒。时间戳校验肯定会出现客户端和服务端不一致的情况,我们允许一定的差值,超过了就证明是过期的请求。

algorithm:MAC 算法的标准名称

spring.redis:就是 Redis 的配置信息,请注意前面加 spring,在作者文档中没有加 spring。

在启动类上添加签名扫描注解@SignedScan,注解中会做自动装配的工作。

代码语言:javascript
复制
@SpringBootApplication
@SignedScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

签名校验

在要进行签名的接口上增加@SignedMapping 注解,也可以放在类上。签名参数信息可以用框架自带 SignedParam 类,也可以自定义,自定义的话再自己的类上通过注解的方式标识 appId 等信息即可。

代码语言:javascript
复制
@RequestMapping("base")
@SignedMapping
public String base(@RequestBody SignedParam signedParam) {
    logger.info("The request data is :" + signedParam.getData());
    return "Base test is ok.";
}

参数类:

代码语言:javascript
复制
@SignedEntity
public class SignedParam {
    @SignedAppId
    private String appId;
    private String data;
    @SignedTimestamp
    private long timestamp;
    @SignedNonce
    private int nonce;
    @Signature
    private String signature;
}

然后就可以测试接口了,填写对应的认证信息,签名需要根据算法将参数进行签名,后端校验才能通过。

图片

签名步骤

  • 将请求参数依据参数名称(首字母小写)的 ASCII 序进行升序排列, 参与排序的参数包括除 signature 以外的所有请求参数。
  • 将排序后的请求参数依照参数名=参数值的形式格式化, 然后将各个参数依序用&符号拼接在一起, 得到待签名字符串 plainText。
代码语言:javascript
复制
appId=APP_ID_TEST&data={"userId":"test"}&nonce=-2028703096&timestamp=1597415679
  • 以 HMAC-SHA1 算法为例对 plainText 进行加密, 再使用 Base64 对加密后的字节流进行编码, 即得到了最终签名 signature signature=base64_encode(hash_hmac('sha1',
plainText,

appSecret, true));

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿天地 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集成框架
  • 签名校验
  • 签名步骤
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档