VUE+SpringBoot实现传输加密

VUE+SpringBoot实现传输加密

背景

前段时间公司做项目,该项目涉及到的敏感数据比较多,经过的一波讨论之后,决定前后端进行接口加密处理,采用的是 AES + BASE64 算法加密~

为实现AES,自然而然想到“crypto”。上网查询相关的技术或工具,一大堆最后自我选型前端采用cryptoJS、后端使用了hutool(糊涂)开源工具,接下来上手开干。

 

前端


1、引入cryptoJS

npm install crypto-js --save-dev

2、编写加密/解密函数

const CRYPTOJSKEY= "afDeffjlj0343jjF";//前后端定义的密钥,AES使用16位
// 加密
function encrypt(plaintText) {
  var plaintText = plaintText;
  var options = {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
  };
  var key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY);
  var encryptedData = CryptoJS.AES.encrypt(plaintText, key, options);
  var encryptedBase64Str = encryptedData.toString().replace(/\//g, "_");
  encryptedBase64Str = encryptedBase64Str.replace(/\+/g,"-");
  return encryptedBase64Str;
}

//解密
function decrypt(encryptedBase64Str) {
  var vals = encryptedBase64Str.replace(/\-/g, '+').replace(/_/g, '/');
  var options = {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
  };
  var key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY);
  var decryptedData = CryptoJS.AES.decrypt(vals, key, options);
  var decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData);
  return decryptedStr
}

3、前端数据加密

注:根据自身项目选择使用数据加密代码

我采用请求前拦截操作,encrypt(JSON.stringify(config.data))部分为使用代码 ,如下:

// request interceptor
instance.interceptors.request.use(
  config => {
    // Do something before request is sent
    if (store.getters.token) {
      config.headers["Authorization"] = `Bearer ${getToken()}`; // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
    }
    config.data = encrypt(JSON.stringify(config.data))
    return config;
  },
  error => {
    // Do something with request error
    Message.error("对不起,出错了");
    console.log(error); // for debug
    Promise.reject(error);
  }
);

4、axios请求

注:根据自身编写axios请求,但请求头中Content-Type需为:application/json;charset=UTF-8

export const createAPI = (url, method, data) => {
  let config = {};
  if (method === "get") {
    config.params = data;
  } else {
    config.data = data;
  }
  config.headers = {
    "Content-Type": "application/json;charset=UTF-8"
  };

  return instance({
    url,
    method,
    ...config
  });
};

5、请求结果

后端


1、引入hutool

本人是Maven项目,即在pom.xml添加

<!--糊涂工具 https://github.com/looly/hutool/-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>

2、处理方案(即拦截)定位

分析:

1、数据加密/解密主要是针对请求/响应的body进行处理。

2、springboot前后端对接点为Controler。

3、如何实现在Controler接收前就实现拦截处理呢?

方案一、

提及到拦截大多数人会想到拦截器、过滤器,在此不做采用方案。

方案二、(采用方案)

1、提及到body,spring中有没有相关的类就能操作body呢?

答案:RequestBodyAdvice与ResponseBodyAdvice

我们来看看这2个类源码

RequestBodyAdvice:



package org.springframework.web.servlet.mvc.method.annotation;

import java.io.IOException;
import java.lang.reflect.Type;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.lang.Nullable;

public interface RequestBodyAdvice {
    boolean supports(MethodParameter var1, Type var2, Class<? extends HttpMessageConverter<?>> var3);

    HttpInputMessage beforeBodyRead(HttpInputMessage var1, MethodParameter var2, Type var3, Class<? extends HttpMessageConverter<?>> var4) throws IOException;

    Object afterBodyRead(Object var1, HttpInputMessage var2, MethodParameter var3, Type var4, Class<? extends HttpMessageConverter<?>> var5);

    @Nullable
    Object handleEmptyBody(@Nullable Object var1, HttpInputMessage var2, MethodParameter var3, Type var4, Class<? extends HttpMessageConverter<?>> var5);
}

ResponseBodyAdvice:


package org.springframework.web.servlet.mvc.method.annotation;

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.lang.Nullable;

public interface ResponseBodyAdvice<T> {
    boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);

    @Nullable
    T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}

看到beforeBodyRead与beforeBodyWrite这2个接口了吧!开不开心正式我们想要的东西。那我来实现他吧:

自定义请求实现类DecryptRequestBodyAdvice.java:

/**
 * 请求数据接收处理类<br>
 *
 * 对加了@Decrypt的方法的数据进行解密操作<br>
 *
 * 只对 @RequestBody 参数有效
 * @author xxm
 */
@ControllerAdvice
public class DecryptRequestBodyAdvice implements RequestBodyAdvice {

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

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

    @Override
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
                                  Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                           Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
//        if( NeedCrypto.needDecrypt(parameter) ){
//            return new DecryptHttpInputMessage(inputMessage , charset , key);
//        }
//        return inputMessage;
        return new DecryptHttpInputMessage(inputMessage , charset , key);//请求信息解密,参考DecryptHttpInputMessage解密类
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }
}

自定义响应实现类EncryptResponseBodyAdvice.java:

/**
 * 请求响应处理类<br>
 *
 * 对加了@Encrypt的方法的数据进行加密操作
 *
 * @author 熊诗言
 *
 */
@ControllerAdvice
public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {

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

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return NeedCrypto.needEncrypt(returnType);
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //TODO 实现具体的加密方法
        System.out.println("________________");

        return body;
    }

}

注:必须加入@ControllerAdvice注解,没有它是没有注入到spring中的。

自定义请求信息解密类,DecryptHttpInputMessage.java:

/**
 *
 * @author xxm
 */
public class DecryptHttpInputMessage implements HttpInputMessage {
    private HttpInputMessage inputMessage;
    private String charset;
    private String key;

    public DecryptHttpInputMessage(HttpInputMessage inputMessage, String charset , String key) {
        this.inputMessage = inputMessage;
        this.charset = charset;
        this.key = key;
    }

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

        return new ByteArrayInputStream(bytes);
    }

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

}
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要实现Spring Boot Vue传输加密,可以采用以下步骤: 1. 在Spring Boot中使用HTTPS协议来加密传输数据。可以使用自签名证书或者购买正式的SSL证书。 2. 在Vue中使用HTTPS协议来加密传输数据。可以使用axios库来发送HTTPS请求。 3. 在Spring Boot中使用JWT(JSON Web Token)来对用户身份进行认证和授权。JWT可以在服务器端生成一个加密的token,包含用户的身份信息和权限信息,然后在每次请求时将token发送给服务器进行验证。 4. 在Vue中使用JWT来对用户身份进行认证和授权。可以在登录成功后将服务器返回的token保存在本地,然后在每次请求时将token发送给服务器进行验证。 5. 在Spring Boot中使用Spring Security来对API进行保护。可以使用注解来限制API的访问权限,只允许已经认证和授权的用户访问。 6. 在Vue中使用路由守卫来对页面进行保护。可以在路由配置中使用beforeEach函数来判断用户是否已经认证和授权,如果没有则跳转到登录页面。 通过以上步骤,可以实现Spring Boot Vue传输加密,保护数据的安全性。 ### 回答2: 要实现Spring Boot和Vue之间的传输加密,可以采用以下步骤: 1. 在Spring Boot中配置HTTPS协议,以确保数据在传输过程中的安全性。可以使用自签名证书或第三方证书来配置HTTPS。 2. 在Spring Boot应用程序的配置文件中,设置以下属性来启用HTTPS: ```yaml server: port: 8443 # 设置HTTPS端口 ssl: key-store: classpath:keystore.jks # 设置SSL证书的路径 key-store-password: password # 设置SSL证书的密码 key-store-type: JKS # 设置SSL证书的类型 key-alias: tomcat # 设置SSL证书的别名 ``` 3. 在Vue应用程序中使用HTTPS协议来访问Spring Boot后端。可以使用axios库来发送HTTPS请求。 ```javascript import axios from 'axios'; axios.defaults.baseURL = 'https://your-domain.com'; // 设置Spring Boot后端的URL // 发送HTTPS POST请求 axios.post('/api/your-endpoint', { data }) .then(response => { // 处理响应数据 }) .catch(error => { // 处理错误 }); ``` 4. 可以使用JSON Web Token(JWT)来对请求进行加密和验证。在Spring Boot中,可以使用Spring Security和jjwt库来实现JWT的生成和验证。 ```java // 生成JWT token String token = Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET.getBytes()) .compact(); // 在请求中验证JWT token String token = request.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { // 验证token } ``` 通过以上步骤,可以实现Spring Boot和Vue之间的传输加密,确保数据在传输过程中的安全性和完整性。 ### 回答3: 要实现Spring Boot和Vue之间的数据传输加密,可以采用以下步骤: 1. 在Spring Boot后端应用中,可以使用Spring Security来实现数据传输加密。首先,配置HTTPS协议,可以通过自签名证书或者证书颁发机构(CA)签发的证书来实现。这样可以确保前后端之间的数据传输过程中是加密的。 2. 在Vue前端应用中,可以通过使用HTTPS协议访问后端API来保证数据传输的安全性。可以通过配置Vue的开发环境或者生产环境,将访问后端API的地址改为HTTPS协议。 3. 在Vue前端应用中,可以使用CryptJS加密库来对敏感数据进行加密。例如,可以对用户密码等敏感信息进行加密传输,确保数据在前后端之间的传输过程中不被窃取或篡改。 4. 在Spring Boot后端应用中,可以使用JWT(JSON Web Token)来实现身份验证和安全传输。可以在用户登录成功后生成一个JWT,并将其返回给前端,前端每次请求通过将JWT放置在请求头中进行验证。这样可以确保数据传输的安全性和权限控制。 综上所述,通过配置HTTPS协议、使用加密库进行数据加密、使用JWT实现身份验证等方式,可以实现Spring Boot和Vue之间的数据传输加密,从而保证数据在传输过程中的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值