专栏首页猿天地还在手动对参数进行签名校验?太落后了吧!

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

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

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

集成框架

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

<dependency>
    <groupId>cn.oever</groupId>
    <artifactId>api-signed</artifactId>
    <version>0.0.1</version>
</dependency>

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

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,注解中会做自动装配的工作。

@SpringBootApplication
@SignedScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

签名校验

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

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

参数类:

@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。
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));

本文分享自微信公众号 - 猿天地(cxytiandi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自古帝王多短命,假如皇帝也懂负载均衡算法...

    大家都知道古代皇帝各个都是后宫佳丽三千,而皇帝身上都天然的带着雨露均沾的精神,不想单独的宠爱一人!

    猿天地
  • 微信中页面二次分享小图标丢失问题

    在我们有房APP1.1的版本中增加了房产资讯的功能,昨天晚上有同事在群里反馈从APP中分享的资讯到微信中,然后再次分享出去的时候标题和小图标不见了,见下图:

    猿天地
  • 那天晚上和@FeignClient注解的深度交流

    主要还是在技术群里看到有同学在问相关问题,比如: contextId 是干嘛的?name 相同的多个 Client 会报错?

    猿天地
  • 微信支付开发实记

    微信支付分为JSAPI支付,扫码支付,APP支付,小程序支付等不同的支付方式。但大体的支付过程是一致的,本文以JSAPI支付,也就是微信内的H5支付为例,描述一...

    超超不会飞
  • QQ亲密关系 | 从工具到情感再到认同

    ? 腾讯ISUX isux.tencent.com 社交用户体验设计 ? ? 今年是QQ迈入第20周年,QQ发展至今一直以来都在解决人与人沟通的问题,是一款...

    腾讯ISUX
  • SDAccel存储模型详解

    Off-Chip Global memory 指的是在FPGA板卡上通过硬件与FPGA芯片连接的内存条。数据存取所花费的时间相对较长,但是容量相对较大。

    AI异构
  • ​WakeData入选2020中国SaaS企业新锐企业Top10|腾讯SaaS加速器·学员动态

    ? 来源 |  腾讯SaaS加速器首期项目-WakeData ---- 腾讯SaaS加速器 二期30席项目招募 报名方式 腾讯SaaS加速器,作为腾讯产业加速...

    腾讯SaaS加速器
  • go 数据库相关

    创建db后并不需要自己去使用db.Close()去关闭,虽然提供了这样关闭方法但是完全不需要使用。

    solate
  • 科研工具篇 | 不要做装备派,要做个装备精良的实力派

    荀子在《劝学篇》中讲到,”君子性非异也,善假于物也“。在生活中,善用各种工具能够极大的提高我们的效率,在科研工作中亦是如此。今天给大家介绍在科学研究和论文写作自...

    谭庆波
  • idea连接docker实现一键部署

    HUC思梦

扫码关注云+社区

领取腾讯云代金券