前端uni-app,后端使用java,接口加密解密

最近开发一个小程序使用的uni-app做了一些封装

首先是前端

import CryptoJS from 'crypto-js';
const secretKey = "secret-key";

// 统一的请求方法
function request(url, method, data) {
  // 对称加密,这里选用 AES 算法
  const key = CryptoJS.enc.Utf8.parse(secretKey);
  const iv  = CryptoJS.enc.Utf8.parse(secretKey.substring(0, 16));
  const encryptedData = CryptoJS.AES.encrypt(JSON.stringify(data), key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }).toString();
  
  return uni.request({
    url: url,
    method: method,
    header: {
      'content-type': 'application/json'
    },
    data: encryptedData
  }).then(res => {
      // 返回解密后的数据
      const decryptedData = CryptoJS.AES.decrypt(res.data, key, {
        iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });
      const plaintext = decryptedData.toString(CryptoJS.enc.Utf8);
      return Promise.resolve(JSON.parse(plaintext));
    }).catch(err => {
      console.error('request failed:', err);
      return Promise.reject(err);
    });
}

export { request };

服务端肯定是在拦截器层进行统一的处理

public class DecryptInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;

            Method method = handlerMethod.getMethod();
            Decrypt decryptedData = method.getAnnotation(Decrypt.class);
            if (decryptedData != null) {
                // 从请求体中读取密文数据
                String encryptedData = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);

                // 解密数据
                String plainText = DecryptUtil .decrypt(encryptedData, "your-secret-key");

                // 将明文数据设置到请求体中
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest req = attributes.getRequest();
                WrappedHttpServletRequest wrappedReq = new WrappedHttpServletRequest(req);
                wrappedReq.setBody(plainText.getBytes());

                requestContext.setRequest(wrappedReq);
            }
        }

        return true;
    }

}

然后是那几个工具类比如解密的工具类

public class DecryptUtil {

    // 解密方法
    public static String decrypt(String data, String secretKey) {
        try {
            byte[] encryptedData = Base64.decodeBase64(data);
            byte[] key1 = getSubByteArray(secretKey.getBytes(), 0, 16);
            byte[] iv1 = getSubByteArray(secretKey.getBytes(), 0, 16);
            SecretKeySpec secretKeySpec = new SecretKeySpec(key1, "AES");
            IvParameterSpec iv = new IvParameterSpec(iv1);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
            return new String(cipher.doFinal(encryptedData));
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    // 获取字节数组的子数组
    private static byte[] getSubByteArray(byte[] data, int start, int length) {
        byte[] result = new byte[length];
        System.arraycopy(data, start, result, 0, length);
        return result;
    }
}

写个测试类

@RestController
@RequestMapping("/api")
public class TestController {

    // 加入 Decrypt 注解
  	@PostMapping(value = "/test", consumes = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<String> test(@RequestBody @Decrypt User user) {
        System.out.println(user);
        return ResponseEntity.ok("success");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uni-app 是一个跨平台的开发框架,支持在一套代码中同时开发iOS、Android和Web等多个平台应用。在uni-app使用AES解密需要以下步骤: 1. 导入crypto-js库:在uni-app项目中使用AES解密,首先需要在项目中导入crypto-js库。可以通过npm或手动下载方式获取crypto-js库,并在项目中引入。在uni-app中,可以通过使用uni.requireModule('crypto-js')进行引入。 2. 准备密钥和密文:在解密之前,需要准备好AES的密钥和密文。密钥是用于解密的关键,密文是需要解密的数据。 3. 进行解密操作:使用crypto-js库提供的AES方法进行解密操作。首先需要通过密钥初始化AES对象,然后使用密文和AES对象的decrypt方法进行解密。最后将解密后的数据转换为字符串格式。 以下是一个使用AES解密的示例代码: ```js // 引入crypto-js库 const crypto = uni.requireModule('crypto-js'); // 准备密钥和密文 const key = crypto.enc.Utf8.parse('your_key'); const ciphertext = 'your_ciphertext'; // 进行解密操作 const decrypted = crypto.AES.decrypt(ciphertext, key, { mode: crypto.mode.ECB, padding: crypto.pad.Pkcs7 }).toString(crypto.enc.Utf8); console.log(decrypted); ``` 上述示例代码中,需要将'your_key'替换为实际的AES密钥,'your_ciphertext'替换为需要解密的密文。 需要注意的是,安全性较高的应用中应使用更加复杂的密钥和加密模式。在实际使用过程中,需要根据具体的需求和安全要求进行参数的配置和调整。为了更好地保障数据安全,建议在使用AES解密时,遵循相关的安全标准和最佳实践。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值