首页 > 其他分享 >接口加密传输设计及AES加解密代码DEMO

接口加密传输设计及AES加解密代码DEMO

时间:2024-04-21 09:33:05浏览次数:31  
标签:加密传输 AES encrypt String DEMO 解密 cipher key

接口加密传输设计及AES加解密代码DEMO

接口加密的方案设计:可以将请求的json字符串aes加密,通过params字段传输,
接口服务端接收到参数,先解密,然后转换成对象。
继续业务逻辑的处理。
(另外一种方案是:针对敏感字段aes加密,服务接收端对敏感字段来解密处理)

RequestVo对象:

    private String params;
    private String sign;

伪代码

String encrypt = requestVo.getParams();
    RealReqVO realReqVO = new RealReqVO();
    String decryptJson = decryt(encrypt,key);
    //json转换为对象
    realReqVO = JSON.parseObject(decryptJson,ReceiveReqVO.class);
    log.info("数据接口(解密后),入参:{}", JSON.toJSONString(realReqVO));
    if(StringUtils.isBlank(realReqVO.getSign())){
        realReqVO.setSign(request.getSign());
    }
    //对sign简单处理是:能否aes解密成功~
    validateSign(request.getSign(), key);

以下是AES加解密的DEMO

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class DesTest {
    public static String decryt(String input, String key) {
        byte[] output = null;
        String res = "";
        try {
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skey);
            output = cipher.doFinal(Base64.decodeBase64(input.getBytes()));
            return new String(output,StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    public static String encrypt(String input, String key) {
        String res = "";
        try {
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skey);
            byte[] output = cipher.doFinal(input.getBytes());
            res = Base64.encodeBase64String(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    public static void main(String[] args) throws Exception {
        //Input length must be multiple of 16 when decrypting with padded cipher
        //AES解密报错,Input length must be multiple of 16 when decrypting with padded cipher    
        //加密方案及AES加密,需要同一个key。 或者是AES密文被修改,无法解密。
        //AES解密报错,Input length must be multiple of 16 when decrypting with padded cipher
        //具体解决就是:在解密前再转一次编码,基本就能解决这一报错问题。
     //原因分析:前端enCode在后端解析失败,最后的%3D无法解析,导致偏移向量对应不上,报错 //String un="8RKHWcE11foCm2%2BaEuFG6w%3D%3D"; //String pd="TQafftXrh8aXYNFJcPgw1w%3D%3D"; //先转编码!!! //String ufUserName = URLDecoder.decode(un, "UTF-8"); //String ufPassWord = URLDecoder.decode(pd, "UTF-8"); //此时里面的%3D 解析成了= //8RKHWcE11foCm2%2BaEuFG6w== //TQafftXrh8aXYNFJcPgw1w== //然后再去解密 //Invalid AES key length: 7 bytes String key = "testKeytestKeytestKeytestKey1234"; //32位长度 String content = "{10086}"; String encrypt = encrypt(content, key); System.out.println("encrypt=" + encrypt); String decrypt = decryt(encrypt, key); System.out.println("decrypt=" + decrypt); } }

 

标签:加密传输,AES,encrypt,String,DEMO,解密,cipher,key
From: https://www.cnblogs.com/oktokeep/p/18148593

相关文章

  • React 简单登录平台Demo(2):使用Anti写登录框架
    目录前言参考登录页面基础框架layout.tsxpage.tsxTailWind使用好看的渐变颜色flex布局填充布局居中布局显示效果总结前言在适用了一下Anti之后发现,学起来成本实在太高了,先用Anti默认的目标凑合一下好了。反正我也就是一个普通的后端,能用React写就不错了,样式凑合凑合能用就行。......
  • React 简单登录平台Demo(1):Next.js配置
    目录前言体验Next.js中文文档路径问题创建项目启动报错测试TailWindCSS热重载如何添加路由第三方库引入tailwindcss配置相关链接布局新建布局布局也是嵌套影响的根节点layout配置路由跳转Link跳转Hook跳转简单的登录页面前言我之前的那个项目写到后面,发现还不如直接用Next.js呢......
  • React 简单登录平台Demo(0):环境配置
    目录前言Create-react-app环境配置文件路径添加组件添加tailWindcss文件tailwind.config.js添加compilecss目标常见错误添加路由简单路由添加复杂路由添加LoginPageMainPagerouter.js总结前言这次用React简单写一个登录网页的DemoCreate-react-app环境配置create-react-app......
  • 图片压缩demo
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>压缩demo</title></......
  • MyBatis-01-Demo
    数据库DDLCREATEDATABASE`mybatis_demo01`;--mybatis_demo01.`user`definitionCREATETABLE`user`(`id`intNOTNULLAUTO_INCREMENT,`username`varchar(100)DEFAULTNULL,`birthday`datetimeDEFAULTNULL,`sex`char(1)DEFAULTNULL,`address`......
  • transformers、torch train demo
    通过pytorch训练模型的逻辑:importtorch.nnasnnimporttorchimportnumpy#fromtorch.utils.tensorboardimportSummaryWriterimporttimevocabList=["0","1","2","3","4","5","6","7"......
  • Rust gRPC 开发 todo-demo
    在這篇文章中,我們將使用gRPC創建一個基本的Todo應用程序。首先,我們將非常快速的概述一下gRPC和ProtocolBuffers。什麼是gRPC?gRPC是一個現代的開源的高性能遠程過程調用(RPC)框架,可以在任何環境下運行。RPC代表遠程過程調用(RemoteProcedureCall),開頭的g代表通......
  • POI2006EST-Aesthetic Text
    POI#Year2006#dp\(dp_{i,j}\)表示考虑到第\(i\)个单词,当前行长度为\(j\)的最小代价暴力转移是\(\mathcal{O}(n^3)\)的然后观察到,其实合法的转移不能卡满,具体来说,有至少\(\frac{1}{16}\)的常数,因为\(dp\)转移还有\(<1\)的常数,所以可以水过去//Author:xiaruize......
  • Springboot集成WebSocket实现智能聊天【Demo】
    背景openai目前越来越流行,其他ai产业也随之而来,偶然翻到openai接口文档,就想着可以调用接口实现智能聊天,接下来就写写我怎么接入websocket的过程,文笔不佳,谅解。接入WebSocket1.webSocket依赖<dependency><groupId>org.springframework.boot</groupId><artifactId......
  • C# NModbus 4 demo
    1.添加modbus程序包 2.创建 ModbusSerialMaster 实例对象 privatestaticModbusSerialMasterCreateModbusRtu(){SerialPortport=newSerialPort();port.PortName="COM11";port.BaudRate=9600;......