SpringBoot+Vue使用AES进行接口加密

目录

前言

一、前端工作准备

  1.下载crypto-js

  2.加密解密工具类

  3.对axios请求拦截加密

二、后端工作准备

  1.所需依赖

  2.实现RequestBodyAdvice 

  3.实现HttpInputMessage

三、数据响应加密(扩展)

  1.实现 ResponseBodyAdvice(后端)

  2.axios响应拦截器(前端)


前言

        在数字化时代,数据安全已成为企业和社会关注的焦点。为了确保数据的机密性和完整性,我们采用SpringBoot和Vue技术,结合AES对称加密,构建一个高效且安全的系统。AES加密算法以其高度的安全性和广泛的应用场景,成为了数据加密的首选方案。通过在SpringBoot后端实现AES加密和解密逻辑,我们能够确保数据在传输和存储过程中的安全。同时,在Vue前端,我们利用相应的加密和解密方法,实现了与后端的无缝对接。这样,无论是数据的发送还是接收,都能够得到充分的保护。这种加密方案不仅提高了系统的安全性,也增强了用户的信任度。

一、前端工作准备

  1.下载crypto-js

npm install crypto-js --save-dev

  2.加密解密工具类

        keyOne是自己设置的一个key,可以根据你自己的业务来设置

import cryptoJs from 'crypto-js'
// 加密
let keyOne = '313233343536373a'
export function encrypt(word) {
    let key = cryptoJs.enc.Utf8.parse(keyOne)
    let enc = ''
    if (typeof word === 'string') {
        enc = cryptoJs.AES.encrypt(word, key, {
            // iv: iv
            mode: cryptoJs.mode.ECB,
            padding: cryptoJs.pad.Pkcs7
        })
    } else if (typeof word === 'object') {
        let data = JSON.stringify(word)
        enc = cryptoJs.AES.encrypt(data, key, {
            // iv: iv
            mode: cryptoJs.mode.ECB,
            padding: cryptoJs.pad.Pkcs7
        })
    }
    let encryptedData = enc.ciphertext;
    var encryptedBase64Str = encryptedData.toString().replace(/\//g, "_");
    encryptedBase64Str = encryptedBase64Str.replace(/\+/g,"-");
    console.log(encryptedBase64Str)
    return encryptedBase64Str;
}

//解密
export function decrypt(word) {
    console.log('传入的密文:', word)
    let key = cryptoJs.enc.Hex.parse(keyOne)
    let dec = cryptoJs.AES.decrypt(cryptoJs.format.Hex.parse(word), key, {
        // vi: vi
        mode: cryptoJs.mode.ECB,
        padding: cryptoJs.pad.Pkcs7
    })
    return cryptoJs.enc.Utf8.stringify(dec)
}

  3.对axios请求拦截加密

        这边我设置有一个拦截器,并且我只对Post请求进行拦截,其他请求不拦截,如果你想要其他请求(get、put、delete)进行拦截,则可以仿照Post请求来进行数据加密

const whiteList = ['/user/login',"/upload/oss"]; //排除的路径
// 请求拦截器
service.interceptors.request.use(
    config => {
        if (store.getters.token) {
            // 设置令牌请求头
            config.headers['authorization'] = store.getters.token;
        }

        if (config.method === 'post' && whiteList.indexOf(config.url)===-1 && config.data){
            config.headers['Content-Type'] = 'application/json;charset=UTF-8';
            config.data = encrypt(config.data)
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
);

二、后端工作准备

  1.所需依赖

        <!--        hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.17</version>
        </dependency>

  2.自定义注解

        该注解用于在Post请求的方法上添加,open字段为是否打开解密,默认为true(打开)。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AESCrypto {
	boolean open() default true;
}

  3.实现RequestBodyAdvice 

package com.pzg.chat.handler;
@Slf4j
@ControllerAdvice
public class DecryptRequestBodyAdviceHandler implements RequestBodyAdvice {

	@Value("${crypto.charset}")
	private String charset = "UTF-8";
	@Value("${crypto.key}")
	private String key;

	@Override
	public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
		return true;
	}

	@Override
	public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {

		AESCrypto methodAnnotation = methodParameter.getMethodAnnotation(AESCrypto.class);
		if (methodAnnotation!=null && BooleanUtil.isTrue(methodAnnotation.open())){
			return new DecryptHttpInputMessageHandler(inputMessage , charset , key);//请求信息解密,参考DecryptHttpInputMessage解密类
		}
		return inputMessage;
	}

	@Override
	public Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
		return body;
	}

	@Override
	public Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
		return body;
	}
}

  4.实现HttpInputMessage

public class DecryptHttpInputMessageHandler implements HttpInputMessage {

	private HttpInputMessage inputMessage;
	private String charset;
	private String key;

	public DecryptHttpInputMessageHandler(HttpInputMessage inputMessage, String charset , String key) {
		this.inputMessage = inputMessage;
		this.charset = charset;
		this.key = key;
	}
	@Override
	public InputStream getBody() throws IOException {
		//使用hutool开始解密
		InputStream body = inputMessage.getBody();
		String content = IoUtil.read(body , charset);
		byte[] bytes = SecureUtil.aes(key.getBytes(charset)).decrypt(content);

		return new ByteArrayInputStream(bytes);
	}

	@Override
	public HttpHeaders getHeaders() {
		return inputMessage.getHeaders();
	}
}

        最后当前端发送post请求到后端后,就会被我们定义的 DecryptRequestBodyAdviceHandler 类所拦截,并获取其中信息并进行解密。

三、数据响应加密(扩展)

  1.实现 ResponseBodyAdvice<Object>(后端)

@ControllerAdvice
public class EncryptResponseBodyAdviceHandler implements ResponseBodyAdvice<Object> {
	@Override
	public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
		return true;
	}

	@Override
	public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        sout("-------------->你的加密逻辑")
		return null;
	}
}

  2.axios响应拦截器(前端)

axios.interceptors.response.use(
  (response) => {
    console.log("----------->解密逻辑")
    switch (response.data.code) {
      case 40001:
        Vue.prototype.$message({
          type: 'error',
          message: response.data.message
        })
        router.push({ path: '/login' })
        break
      case 50000:
        Vue.prototype.$message({
          type: 'error',
          message: response.data.message
        })
        break
    }
    return response
  },
  (error) => {
    return Promise.reject(error)
  }
)
  • 55
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对接支付宝接口涉及到前后端的交互,具体步骤如下: 1. 在支付宝开放平台注册开发者账号,并创建应用获取应用的AppID、公钥、私钥等信息。 2. 后端(Spring Boot)部分: - 引入支付宝SDK,可以使用官方提供的SDK或者第三方封装的SDK。 - 在应用配置文件中配置支付宝相关参数,如AppID、公钥、私钥等。 - 编写接口用于生成支付宝订单信息,并将订单信息返回给前端。 - 编写接口用于接收支付宝异步通知,验证支付结果并处理业务逻辑。 - 编写接口用于查询订单状态等其他操作。 3. 前端(Vue)部分: - 使用支付宝提供的前端组件,如扫码支付组件、H5支付组件等。 - 在前端页面中引入支付宝提供的组件,并配置相关参数,如AppID、订单信息等。 - 编写逻辑处理用户支付成功或失败的回调方法,并提示用户支付结果。 4. 后端与前端通信: - 后端提供生成订单信息的接口前端调用该接口获取订单信息。 - 前端将订单信息传递给支付宝前端组件,并完成支付操作。 - 支付宝将支付结果以异步通知的形式发送给后端,后端接收并验证支付结果。 - 后端处理支付结果,更新订单状态等业务逻辑。 需要注意的是,在实际操作中还需要考虑安全性、异常处理、日志记录等方面的内容,以确保支付流程的稳定和安全。同时,支付宝也提供了详细的开发文档和示例代码,可以参考官方文档进行具体操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱生活,更爱技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值