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

有做过开放平台的同学肯定知道 , 对外的 API 都要做签名校验 , 防止重放等来保证安全性 。 既然是统一地校验 , 那就没必要让每个开发接口的同学都去手动的进行校验 , 这个时候我们需要统一进行签名的校验和重放的校验 。
今天给大家推荐一个 API 校验的框架 , 通过注解和切面的方式自动进行签名校验 , 并且支持自定义算法 , 使用简单 , 我强调一下 , 大家如果要用于自己的项目中 , 可以下载源码稍微改造下 , 因为我觉得还有些地方没有处理好 , 当然大家可以借鉴这个项目的思路 , 还是不错的 。
集成框架可以直接使用作者已经上传了的 jar 包 , 当然你也可以自己下载源码编译 。
cn.oeverapi-signed0.0.1添加配置信息 , 主要配置加密算法和 Redis 信息 , 因为这个项目用到了 Redis 做防止重放 。
server:port: 8080oever:signature:time-diff-max: 300algorithm: HmacSHA1spring:redis:host: 127.0.0.1port: 6379password:time-diff-max:调用方与服务器时间戳允许的最大差值 , 单位秒 , 默认值 10 秒 。 时间戳校验肯定会出现客户端和服务端不一致的情况 , 我们允许一定的差值 , 超过了就证明是过期的请求 。
algorithm:MAC 算法的标准名称
spring.redis:就是 Redis 的配置信息 , 请注意前面加 spring , 在作者文档中没有加 spring 。
在启动类上添加签名扫描注解@SignedScan , 注解中会做自动装配的工作 。
@SpringBootApplication@SignedScanpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}签名校验在要进行签名的接口上增加@SignedMapping 注解 , 也可以放在类上 。 签名参数信息可以用框架自带 SignedParam 类 , 也可以自定义 , 自定义的话在自己的类上通过注解的方式标识 appId 等信息即可 。
@RequestMapping("base")@SignedMappingpublic String base(@RequestBody SignedParam signedParam) {logger.info("The request data is :" + signedParam.getData());return "Base test is ok.";}参数类:
@SignedEntitypublic class SignedParam {@SignedAppIdprivate String appId;private String data;@SignedTimestampprivate long timestamp;@SignedNonceprivate int nonce;@Signatureprivate String signature;}然后就可以测试接口了 , 填写对应的认证信息 , 签名需要根据算法将参数进行签名 , 后端校验才能通过 。
还在手动对参数进行签名校验?太落后了吧文章插图
图片
签名步骤

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

还在手动对参数进行签名校验?太落后了吧文章插图
【还在手动对参数进行签名校验?太落后了吧】如果觉得本文对你有帮助 , 可以转发关注支持一下