接口校验加密
‘壹’ SpringBoot 接口加密解密,新姿势!
在日常Java开发中,接口的安全性是重要考量因素,尤其是数据传输过程中的加密与解密。为避免重复编写代码,可以设计一个通用的starter,提供一致的加密解密功能。本文将介绍如何通过hutool-crypto实现加密解密,以及如何解决请求流只能读取一次的问题,同时引入SpringBoot的参数校验功能,减少冗余代码。此外,将详细说明如何自定义starter,实现接口的加密与解密功能。
在接口调用链中,request的请求流只能调用一次,导致后续使用请求流获取数据时发现数据为空。为解决此问题,可以继承HttpServletRequestWrapper,复制请求中的流供外部多次使用,或使用Filter替换request,实现流的重复获取。
SpringBoot-validation提供优雅的参数校验功能,使得实体类字段上加上对应注解即可在方法调用前自动校验参数。若希望在代码中调用实体类的校验功能,可利用工具类实现。自定义starter步骤如下,通过RequestBodyAdvice和ResponseBodyAdvice实现接口的加密与解密。
接口响应数据时,返回加密后的数据;接口入参接收解密后的数据。在进入接口前自动解密,获取所需数据。加密解密使用对称加密的AES算法,采用hutool-crypto模块实现。所有实体类提取公共父类,包含时间戳属性,确保数据时效性。加注解EncryptionAnnotation的接口自动对数据进行加密,参数使用RequestBody注解并继承RequestBase的类自动解密,转换为对应数据类型。自定义starter,实现开箱即用。
在项目实现中,首先通过gitee.com/springboot-hl链接获取项目源码,查看项目结构、组件与关键代码。加密与解密功能主要通过crypto-common模块实现,而加密解密starter则在crypto-spring-boot-starter中提供,包括接口、自动配置类、以及请求自动解密、相应自动加密的Advice方法。测试代码位于crypto-test模块,通过application.yml配置文件、实体类Teacher和TestController实现功能验证。
‘贰’ Java 调第三方接口一般都要生成随机字符串后一起加密,请问随机字符串的作用是什么
token俗称令牌。一般用于身份验证。使用MD5或者sha-256
‘叁’ API接口签名验证_MD5加密出现不同结果的解决方法
系统在提供接口给第三方系统使用时,通常为了安全性会做接口加密。
设计原则 :使用HTTPS安全协议 或 传输内容使用非对称加密,这里采用后者。
在对参数进行加密,生成sign时,相同的参数两次加密的结果不一样。
加密规则:
1.拼接出来的字符串不一致
测试时,在加密前将要加密的字符串打印出来比较,发现两次字符串一致。
2.编码问题
加密时,两次的默认编码不一致。
在上述加上默认编码: byte[] btInput = content.getBytes("utf-8"); ,问题解决。
简单实现:
1.接口调用方和接口提供方约定好统一的参数加密算法。
2.接口调用方在调用时把加密后的signature放在参数中去请求接口。
3.判断时间戳有效期。
4.将参数用约定号的加密算法进行加密,与参数中的signature进行比较,一致则调用接口。