# 通用签名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