# sign-sample
**Repository Path**: lib108/sign-sample
## Basic Information
- **Project Name**: sign-sample
- **Description**: 接口签名校验、防止重放攻击、密码非对称加密。该项目包含 服务端(Springboot) 与 客户端(Vue + iview)两部分。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 3
- **Created**: 2021-04-27
- **Last Updated**: 2022-09-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 签名校验 + 重放攻击 + 密文非对称加密 :zzz:
> 小生不足之处,还望各位前辈不吝赐教。
## 项目环境
> server: 基于 springboot 搭建。
>
> client:基于 Vue 搭建。
## 项目规定
###### 注:这里的规定只是指本项目的规定。
#### server
* 接收请求参数统一使用 @RequestParam 注解
#### client
* 请求媒体类型信息:```'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'```
## 签名认证
###### 注:案例说明
### 用户分页列表接口
**请求方法:** **POST | ${url_prefix}/user/list.action**
**请求参数:**
| 参数名 | 类型 | 描述 |
| -------- | ------ | ---------- |
| pageNum | int | 当前页数 |
| pageSize | int | 每页多少个 |
| keyword | string | 查询关键字 |
### **Client 发送请求**,**示例如下:**
```javascript
// 伪代码描述
// 请求体
let params = {
pageNum: 1,
pageSize: 10,
keyword: '大',
}
// 对 param 请求体中的 参数列表按照 ASCII 进行排序。 排序后如下
params = {
keyword: '大',
pageNum: 1,
pageSize: 10
}
// 把排序后的请求转化为 json 字符串。转换后如下
var A = '{"keyword":"大","pageNum":"1","pageSize":"10"}'
// 把转换后生成的字符串A + Secret
// 假设 此时 Secret = 'AAAAAAAAAAAAAAAAAAAAAAAA'
var B = '{"keyword":"大","pageNum":"1","pageSize":"10"}AAAAAAAAAAAAAAAAAAAAAAAA'
// 生成签名 sign
var sign = md5(B)
// 再把 sign 放到请求体汇总
params.sign = sign
// 最后的请求体就是
let params = {
pageNum: 1,
pageSize: 10,
keyword: '大',
sign: sign
}
//... 发送请求。。。
```
### Server 接收请求 校验签名
```java
// SignAuthInterceptor 签名认证拦截器
// 获取 所有请求参数
Map map = request.getParameterMap();
JSONObject params = JSONObject.fromObject(map);
// 获取 请求参数 中 signa
String sign = request.getParameter("sign");
if (StringUtil.isEmpty(sign)){
logger.warn("sign error: " + params);
throw new SignAuthException();
}
// 对请求参数进行排序 生成服务端 自己 sign
SortedMap