用于开放式接口的请求认证和数据加密解密
在项目开发中,有时候会给第三方提供的接口,由于是开放式接口,容易被他人恶意调用,甚至泄露数据。此项目的功能是加密和认证参数。
本项目提供三种功能
- 请求认证: 该功能默认开启, 在服务端配置用户请求唯一key和密钥后,用户调用接口时需要通过唯一key、密钥、时间戳、随机字符串和请求参数拼接后进行摘要运算生成签名
- 请求参数解密: 该功能默认关闭, 开启后用户请求时需要对请求参数进行加密
- 响应加密数据: 该功能默认关闭, 开启后用户收到响应时需要进行解密
重要: 所有功能只对使用@RequestBody方式接收参数的接口生效
引入Maven依赖
<dependency>
<groupId>com.zhangaochong</groupId>
<artifactId>openapi-auth-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
- SpringBoot启动类加@EnableOpenApiAuth注解
- 配置文件添加配置
openapi-auth:
users:
secret-key-map:
用户唯一key: 用户密钥
...
- 在需要用到的Controller类或方法上加@OpenApiAuth注解
- 此时该接口已具备请求认证功能,用户请求时需生成签名
参数名 | 说明 |
---|---|
accessKey | 分配给用户的唯一key |
secretKey | 用户的唯一key对应的密钥 |
timestamp | 当前时间毫秒级时间戳 |
nonce | 随机字符串,每次请求不重复 |
sign | 签名,签名生成方式见后文 |
- 将accessKey,secretKey,timestamp,nonce,sign及业务参数按参数名ascii码顺序排序
- 排序后按key1=value1&key2=value2...拼接字符串
- 将拼接后字符串进行MD5运算生成签名
使用POST json方式
原有业务参数,如
{
"name: "zhangsan",
"age: 20
}
生成签名
sign = md5(accessKey=test&age=20&name=zhangsan&nonce=abcdefg&secretKey=test×tamp=1589877113000)
加入认证参数
{
"name: "zhangsan",
"age: 20,
"accessKey": "test"
"timestamp": 1589877113000
"nonce": "abcdefg"
"sign": "62c0f590c756089adf3632d18a55e7b6"
}
默认通过配置文件配置用户唯一key及密钥,可以通过自定义功能从数据库获取。
- 创建类继承AbstractAuthHandler, 实现getUserSecretKey, saveUserNonce, getUserLastNonce方法
- 配置该类对象为AuthHandler的Bean
@Bean
public AuthHandler authHandler() {
return new XxxAuthHandler();
}
默认请求参数解密关闭,通过修改配置文件开启
- 修改配置文件
openapi-auth:
request-decrypt: enable
- 默认只进行Base64解码,通过实现DecryptHandler类的decrypt方法配置自定义解密方法
- 配置该类对象为DecryptHandler的Bean
@Bean
public DecryptHandler decryptHandler() {
return is -> {
return 解密方法(is);
};
}
默认响应数据加密关闭,通过修改配置文件开启
- 修改配置文件
openapi-auth:
response-encrypt: enable
- 默认只进行Base64编码,通过实现EncryptHandler类的encrypt方法配置自定义加密方法
- 配置该类对象为EncryptHandler的Bean
@Bean
public EncryptHandler encryptHandler() {
return o -> {
return 解密方法(o);
};
}