# 通用签名SDK源码
**Repository Path**: huoyingf4/sign_sdk
## Basic Information
- **Project Name**: 通用签名SDK源码
- **Description**: 开发通用签名SDK源码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 2
- **Created**: 2022-01-07
- **Last Updated**: 2023-09-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 通用签名SDK源码
#### 介绍
开发通用签名SDK源码
#### 软件架构
软件架构说明
双向加密解密:AES,DES3,RSA的工具类
通过继承HttpServletRequestWrapper,配置过滤器的方式实现签名校验
目前只支持post请求类型签名校验
只会对请求体的参数验签
对于重要业务接口,前端请求时需要加入随机字符串,当前时间戳和秘钥(盐)对业务参数进行加签。后端对请求进行验签,防止参数被篡改。
##### 请求header 中参数说明
timestamp: 当前时间戳,13位。作用是保证请求只在指定时间(当前是3分钟)内有效
nonce:随机字符串(长度8~16位均可)。作用是保证指定时间(当前是2分钟)内请求不重复
sign:签名结果
#### 安装教程
1. 导入jar包
~~~
导入本地仓库命令
mvn install:install-file -DgroupId=com.lds -DartifactId=sign_sdk -Dversion=1.0.0 -Dpackaging=jar -Dfile=sign_sdk.jar
~~~
2. 引用jar包
~~~
com.lds
sign_sdk
1.0.0
~~~
#### 使用说明
##### 1. java版本使用说明
###### 1.1 创建过滤器(类名可以自定义)
~~~java
/**
* @Author liudongs
* @E-mail liudongs@aliyun.com
* @Version 1.0.0
* @Description 创建过滤器(类名可以自定义)
**/
@WebFilter(urlPatterns = "/*", filterName = "RepeatedlyReadFilter")
public class RepeatedlyReadFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
RequestWrapper requestWrapper = new RequestWrapper(request);
if(requestWrapper == null){
filterChain.doFilter(request,response);
}else {
filterChain.doFilter(requestWrapper,response);
}
}
@Override
public void destroy() {
}
}
~~~
###### 1.2 创建SignDataHandlerImpl 继承数据处理抽象类SignDataHandler 并实现所有抽象方法
可以根据自己的需要自己实现
~~~java
/**
* @Author liudongs
* @E-mail liudongs@aliyun.com
* @Version 1.0.0
* @Description
**/
@Component
public class SignDataHandlerImpl extends SignDataHandler {
@Value("${md5.signKey}")
private String key;
//获取盐值
@Override
public String getSalt() {
return key;
}
//redis判断是否存在指定key
@Override
public boolean redisHasKey(String key) {
return RedisUtils.hasKey(key);
}
//redis指定key获取值
@Override
public String redisGet(String key) {
return RedisUtils.get(key);
}
//redis设置值 并设置过期时间
@Override
public void redisSet(String key, String value, Long timeout, TimeUnit unit) {
RedisUtils.set(key, value, timeout, unit);
}
}
~~~
###### 1.3 注册一个拦截器和一个过滤器
~~~java
/**
* @description
* @program:
* @author: liudongs
* @create: 2020-08-15 11:10
**/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private SignDataHandlerImpl signDataHandler;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SignAuthInterceptor(signDataHandler));
}
@Bean
public FilterRegistrationBean repeatedlyReadFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean(new RepeatedlyReadFilter());
registration.addUrlPatterns("/*");
return registration;
}
}
~~~
###### 1.4 在需要签名校验的接口上加上注解
~~~
@SignCheck
在接口上加注解
~~~
##### 2. js版本使用说明
~~~html
Title
加密传后端,后端解密
~~~
##### 3. Android版本使用说明
###### 3.1 导入jar包
###### 3.1 使用加密
~~~
Map dataMap = new HashMap<>();
dataMap.put("nonce", nonce);
dataMap.put("timestamp", String.valueOf(timestamp));
//bodyParamStr 业务参数json 字符串,如:"{"name" : "111111"}"
dataMap.put("body", bodyParamStr);
String checkSign = MD5Util.getHmacMD5Signature(dataMap, dataHandler.getSalt());
~~~
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request