本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料

顺便再给大家推荐一套SpringCloud微服务教程,方便学习:

SpringCloud微服务电商项目教程 - 老炮说Java-程序员编程资料和编程经验分享平台​www.laopaojava.com

教程主要包含下面内容:

有没有遇到这样子的接口,放到互联网上面去,谁都可以调用,谁都可以访问,完全就是公开的,这样子的接口,如果只是普通的数据,其实可以考虑,只是可以考虑,但是,一般情况下,我们是不允许这样子做的。

接口安全防什么

1、防止恶意调用攻击

2、防止篡改信息攻击

3、防拦截攻击,数据被截取后进行修改后重新放回去

4、防止数据泄漏攻击

什么是抓包

“ 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。

这是百度百科给我们的解释,当我们一些放到互联网上的数据,直接采用明文的话,就很容易被抓包,然后进行修改或者被恶意植入木马,这是比较恶心的行为,今天我们就来研究一下怎么样对接口进行数据加密。

POM文件

 <!-- springboot核心web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 配置包,用于配置属性文件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- 统一API包 --><dependency><groupId>com.boots</groupId><artifactId>module-boots-api</artifactId><version>2.0.0.RELEASE</version></dependency>

编写加密解密工具类

/*** All rights Reserved, Designed By 林溪* Copyright:    Copyright(C) 2016-2020* Company       溪云阁 .*/package com.module.boots.api.de.utils;import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import org.apache.tomcat.util.codec.binary.Base64;import com.module.boots.exception.CommonRuntimeException;/*** AES加密解密* @author:溪云阁* @date:2020年6月4日*/
public class AesUtils {private static final String KEY_ALGORITHM = "AES";private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";// 默认的加密算法/*** AES 加密操作* @author 溪云阁* @param content 待加密内容* @param password 加密密码* @return String 返回Base64转码后的加密数据*/public static String encrypt(String content, String password) {try {// 创建密码器final Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 设置为UTF-8编码final byte[] byteContent = content.getBytes("utf-8");// 初始化为加密模式的密码器cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 加密final byte[] result = cipher.doFinal(byteContent);// 通过Base64转码返回return Base64.encodeBase64String(result);}catch (final Exception ex) {throw new CommonRuntimeException(ex.fillInStackTrace());}}/*** AES 解密操作* @author 溪云阁* @param content* @param password* @return String*/public static String decrypt(String content, String password) {try {// 实例化final Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 使用密钥初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));// 执行操作final byte[] result = cipher.doFinal(Base64.decodeBase64(content));// 采用UTF-8编码转化为字符串return new String(result, "utf-8");}catch (final Exception ex) {throw new CommonRuntimeException(ex.fillInStackTrace());}}/*** 生成加密秘钥* @author 溪云阁* @param password 加密的密码* @return SecretKeySpec*/private static SecretKeySpec getSecretKey(final String password) {// 返回生成指定算法密钥生成器的 KeyGenerator 对象KeyGenerator kg = null;try {kg = KeyGenerator.getInstance(KEY_ALGORITHM);// AES 要求密钥长度为 128kg.init(128, new SecureRandom(password.getBytes()));// 生成一个密钥final SecretKey secretKey = kg.generateKey();// 转换为AES专用密钥return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);}catch (final NoSuchAlgorithmException ex) {throw new CommonRuntimeException(ex.fillInStackTrace());}}public static void main(String[] args) {final String str = "V9JofCHn02eyXRiDb1VuseRSuOgEQftROwudMPWwMAO2Wk5K7aYZ4Vtm6xiTn5i5";System.out.println(decrypt(str, "xy934yrn9342u0ry4br8cn-9u2"));}}

编写加密注解

/*** All rights Reserved, Designed By 林溪* Copyright:    Copyright(C) 2016-2020* Company       溪云阁 .*/package com.module.boots.api.de;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 返回对body加密,针对类跟方法* @author:溪云阁* @date:2020年6月4日*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseEncrypt {/*** 返回对body加密,默认是true* @author 溪云阁* @return boolean*/boolean value() default true;
}

编写加密判断类

/*** All rights Reserved, Designed By 林溪* Copyright:    Copyright(C) 2016-2020* Company       溪云阁 .*/package com.module.boots.api.de;import org.springframework.core.MethodParameter;/*** 是否需要加密解密* @author:溪云阁* @date:2020年6月4日*/
public class NeedDe {/*** 判断是否需要加密* @author 溪云阁* @param returnType* @return boolean*/public static boolean needEncrypt(MethodParameter returnType) {boolean encrypt = false;// 获取类上的注解final boolean classPresentAnno = returnType.getContainingClass().isAnnotationPresent(ResponseEncrypt.class);// 获取方法上的注解final boolean methodPresentAnno = returnType.getMethod().isAnnotationPresent(ResponseEncrypt.class);if (classPresentAnno) {// 类上标注的是否需要加密encrypt = returnType.getContainingClass().getAnnotation(ResponseEncrypt.class).value();// 类不加密,所有都不加密if (!encrypt) {return false;}}if (methodPresentAnno) {// 方法上标注的是否需要加密encrypt = returnType.getMethod().getAnnotation(ResponseEncrypt.class).value();}return encrypt;}}

编写加密拦截

/*** All rights Reserved, Designed By 林溪* Copyright:    Copyright(C) 2016-2020* Company       溪云阁 .*/package com.module.boots.api.de;import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import com.module.boots.api.de.utils.AesUtils;
import com.module.boots.api.message.ResponseMsg;/*** 对接口数据进行加密* @author:溪云阁* @date:2020年6月4日*/
@ControllerAdvice
public class ResponseEncryptAdvice implements ResponseBodyAdvice<Object> {@Value("${module.boots.response.aes.key}")private String key;@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {return true;}/*** 在写入之前更改body的值* @author 溪云阁* @param body* @param returnType* @param selectedContentType* @param selectedConverterType* @param request* @param response* @return* @return*/@SuppressWarnings({ "unchecked", "rawtypes" })@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {// 判断是否需要加密final boolean encrypt = NeedDe.needEncrypt(returnType);if (!encrypt) {return body;} else {// 如果body是属于ResponseMsg类型,只需要对data里面的数据进行加密即可if (body instanceof ResponseMsg) {final ResponseMsg responseMsg = (ResponseMsg) body;final Object data = responseMsg.getData();if (data == null) {return body;} else {responseMsg.setData(AesUtils.encrypt(data.toString(), key));return responseMsg;}} else {return body;}}}}

加入密钥

# aes的密钥
module.boots.response.aes.key: xy934yrn9342u0ry4br8cn-9u2

编写加密解密接口

/*** All rights Reserved, Designed By 林溪* Copyright:    Copyright(C) 2016-2020* Company       溪云阁 .*/package com.boots.api.de.view.de.view;import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.boots.api.de.view.de.vo.GetEncryptVO;
import com.module.boots.api.de.ResponseEncrypt;
import com.module.boots.api.de.utils.AesUtils;
import com.module.boots.api.message.ResponseMsg;
import com.module.boots.api.utils.MsgUtils;
import com.module.boots.exception.CommonRuntimeException;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;/*** 加密数据接口* @author:溪云阁* @date:2020年6月4日*/
@SuppressWarnings("deprecation")
@Api(tags = { "web服务:加密数据接口" })
@RestController
@RequestMapping("view/deView")
public class DeView {@Value("${module.boots.response.aes.key}")private String key;/*** 获取加密数据* @author 溪云阁* @return ResponseMsg<GetDeVO>*/@ApiOperation(value = "获取加密数据")@GetMapping(value = "/getEncrypt", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@SneakyThrows(CommonRuntimeException.class)@ResponseEncryptpublic ResponseMsg<GetEncryptVO> getEncrypt() {final GetEncryptVO vo = new GetEncryptVO();vo.setId("b037123c");vo.setUserName("xnwqr98urx");return MsgUtils.buildSuccessMsg(vo);}/*** 获取解密数据* @author 溪云阁* @return ResponseMsg<GetDeVO>*/@ApiOperation(value = "获取解密数据")@GetMapping(value = "/getDecrypt", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@SneakyThrows(CommonRuntimeException.class)public ResponseMsg<String> getDecrypt(@RequestParam(value = "content") String content) {final String str = AesUtils.decrypt(content, key);return MsgUtils.buildSuccessMsg(str);}}

测试

从实验的结果上看,我们在获取数据的时候,直接对data里面的数据进行了加密,这种加密方式只有我们自己可以破解,放到网上去,即使只有密钥,也破解不了。

这里只做接口的数据的加密,生产中经常需要加入token,时间戳等进行验证,各位同学自行拓展即可。

java aes加密_springboot.X手册:防抓包?快速实现API接口数据加密相关推荐

  1. aes加密字符串c++_springboot2.2.X手册:防抓包?快速实现API接口数据加密

    溪云阁:专注编程教学,架构,JAVA,Python,微服务,机器学习等,欢迎关注 上一篇:springboot2.2.X手册:redis的7种类型100个方法全解析 有没有遇到这样子的接口,放到互联网 ...

  2. java AES 加密和linux解密

    java AES 加密: package app;import static java.nio.charset.StandardCharsets.US_ASCII; import static jav ...

  3. Java AES 加密解密工具类

    maven 引入一个依赖 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <depen ...

  4. HTTP/HTTPS 请求与防抓包

    TCP/IP分层 TCP/IP的分层共分为四层:应用层.传输层.网络层.数据链路层: 应用层:向用户提供应用层服务时的通讯活动(ftp.dns.http) 传输层:网络连接中两台计算机的数据传输(tc ...

  5. 抓包工具Stream之接口调试和加密解码(二)

    移动端iphone抓包调试神器-Stream安装和使用(一) 之前我们介绍了Stream工具的安装和使用,今天我们再来介绍下抓包请求筛选.接口详情.接口导出.接口调试.接口测试.编码解码加密等 1.抓 ...

  6. iOS安全之【禁止网络代理】(防抓包) | 蓄力计划

    文章目录 引言 划重点 I.iOS APP 不走全局proxy的方案 1.1 隧道APP的请求接口,一些自己特殊接口不走隧道 1.2 hook NSURLSession 进行全局设置 II. 例子:h ...

  7. ios开发防止App被抓包(一句话实现iOS应用底层所有网络请求拦截(如ajax请求拦截),包含http-dns解决方法,有效防止DNS劫持,用于分析http,https请求,禁用/允许代理,防抓包)

    ZXRequestBlock 安装 通过CocoaPods安装 pod 'ZXRequestBlock' 手动导入 将ZXRequestBlock拖入项目中. 导入头文件 #import " ...

  8. java AES加密

    使用JDK8引入的 java.util.Base64 负责base64转码 Base64Tools 工具类,AES加密要用到它,负责 byte 数组的base64编码,base64 编码的目的是消除乱 ...

  9. Android加密通信防抓包,[原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路)...

    [旧帖] [原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路) 0.00元 2014-5-12 22:07 1565 [旧帖] [原创]基于Ta ...

  10. java AES加密解密

    近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位 ...

最新文章

  1. showModalDialog 页面上GridView的分页问题
  2. Noip 2013 练习
  3. Linux学习-01-安装虚拟机与linux系统
  4. JSON用于多态Java对象序列化
  5. 用busybox制作并配置根文件系统
  6. 叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记
  7. Implementation of the USB 3.0 controller not found!
  8. Android背景透明的 Dialog
  9. Linux操作系统多线程信号总结(转)
  10. mysql连接池源码_一个JAVA数据库连接池实现源码
  11. Eclipse离线安装Emmet插件----web开发者绝对熟悉的插件之一
  12. 数据库配置不当,8.8亿条医疗记录遭泄露
  13. MySQL 的DDL DML DQL DCL细节解析 知道这些就够了
  14. mysql上面waring删掉吗_MySQL经典练习题:数据插入,更新,删除
  15. Atitit sift匹配度计算 图片连线 oepncv sift java匹配
  16. 2022年四方系统/四方支付系统部署实战,以及细节讨论,Gitee版本
  17. UG NX 12同步建模:调整面大小
  18. 高通8953烧录之后报ERROR: UFDT apply overlay failed
  19. Activity启动流程源码分析-浅析生命周期函数
  20. 如何将PDF文件转换为PNG图片?

热门文章

  1. Oracle 左连接(+)加号用法及常用语法之间的关系
  2. js中元素属性值的获取
  3. 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
  4. JQuery获得绝对,相对位置的坐标方法
  5. 作业车间调度问题特征与调度效率相关性的研究Correlation of job-shop scheduling problem features with scheduling efficiency
  6. 【GDB调试学习笔记】Makefile多级目录生成多个可执行文件
  7. 排序算法专题-堆排序
  8. GIS案例练习-----------第三天
  9. 模板题——单链表双链表,数组模拟的栈和队列,单调栈和单调队列
  10. c++中的堆(优先级队列 priority_queue)