java采用注解方式将JavaBean转换为XML并采用AES全报文加密

简介: java采用注解方式将JavaBean转换为XML并采用AES全报文加密

引言


上一篇博客中介绍了怎么获得签名,在这篇博客中将介绍如何采用注解方式将JavaBean转换为XML并采用AES全报文加密。


首先看一下生成的xml报文格式。

<?xml version="1.0" encoding="utf-8"?>
<Message> 
  <Sys_Head> 
    <TRAN_CODE>CMS02CMS658</TRAN_CODE>  
    <SEQ_NO>24080348632126308944</SEQ_NO>  
    <CHL_ID>BJRXZQKJ00</CHL_ID>  
    <TRAN_DATE>20190819</TRAN_DATE>  
    <TRAN_TIMESTAMP>7594000</TRAN_TIMESTAMP> 
  </Sys_Head>  
  <Body> 
    <ARRAYLIST> 
      <Row> 
        <SERIALNO>T20190818040100778115546</SERIALNO>  
        <CALLSTATUS>1</CALLSTATUS>  
        <CALLTIME>2019/08/19 10:06:06</CALLTIME>  
        <TALKTIME>08:00:28</TALKTIME>  
        <CALLRESULTCODE>15</CALLRESULTCODE>  
        <CALLRESULTDES>询问是否本人</CALLRESULTDES>  
        <ISONESELF>2</ISONESELF>  
        <ISINUSE>1</ISINUSE> 
      </Row> 
    </ARRAYLIST> 
  </Body> 
</Message>

通过注解的方式进行转换,主要是在定义实体的时候,采用正确的注解即可。


1、第一级节点Message

package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
 * @author zhenghao
 * @description:
 * @date 2019/7/3011:18
 */
@XmlRootElement(name = "Message")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
    @XmlElement(name ="Sys_Head")
    private com.jack.urgerobot.callback.model.Head Head;
    @XmlElement(name ="Body")
    private Body body;
    public com.jack.urgerobot.callback.model.Head getHead() {
        return Head;
    }
    public void setHead(com.jack.urgerobot.callback.model.Head head) {
        Head = head;
    }
    public Body getBody() {
        return body;
    }
    public void setBody(Body body) {
        this.body = body;
    }
}

2、Head节点


package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
 * @author zhenghao
 * @description:
 * @date 2019/7/2612:01
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Head {
    /**
     * 交易码
     */
    private String TRAN_CODE;
    /**
     * 流水号
     */
    private String SEQ_NO;
    /**
     * 请求方身份id
     */
    private String CHL_ID = "BJRXZQKJ00";
    /**
     * 交易日期 20181129
     */
    private String TRAN_DATE;
    /**
     * 交易时间
     */
    private String TRAN_TIMESTAMP;
    /**
     * 签名
     */
    private String SIGNATURE;
   //set get 方法省略
}

3、Body节点

package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.*;
import java.util.List;
/**
 * @author zhenghao
 * @description:
 * @date 2019/7/2612:01
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Body {
    @XmlElementWrapper(name = "ARRAYLIST")
    @XmlElement(name ="Row")
    private List<Row> row ;
    public List<Row> getRow() {
        return row;
    }
    public void setRow(List<Row> row) {
        this.row = row;
    }
}

4、row节点

package com.jack.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
 * @author zhenghao
 * @description:
 * @date 2019/8/517:34
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Row {
    /**
     * 案件流水号
     */
    private String SERIALNO;
    /**
     * 接听状态 码值:1-接通 2-未接通
     */
    private String CALLSTATUS;
    /**
     * 呼叫时间 yyyy/MM/dd HH:mm:ss
     */
    private String CALLTIME;
    /**
     * 通话时间 HH:mm:ss
     */
    private String TALKTIME;
    /**
     * 案件结果码值
     */
    private String CALLRESULTCODE;
    /**
     * 通话结果描述
     */
    private String CALLRESULTDES;
    /**
     * 承诺还款时间  yyyy/MM/dd
     */
    private String PROMISEDATE;
    /**
     * 是否本人 码值:1-是 2-否
     */
    private String ISONESELF;
    /**
     * 号码是否有效 码值:1-有效 2-无效
     */
    private String ISINUSE;
    //set get 省略
}

5、工具类代码

package com.jack.common.utils;
import org.apache.poi.ss.formula.functions.T;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import java.io.StringWriter;
/**
 * @author zhenghao
 * @description:
 * @date 2019/7/2611:21
 */
public class XmlUtils {
    public static String beanToXml(Object obj, String encoding) throws JAXBException {
        String result = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            result = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

6、调用测试

 Message message = new Message();
 message.setBody(body);
 message.setHead(head);
 String strXml = XmlUtils.beanToXml(message, "UTF-8");


到这生成xml的代码完成


7、AES加密工具类

package com.jack.common.utils;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author zhenghao
 * @description: 加密
 * @date 2019/7/3015:06
 */
public class EncryptUntils {
    private static Logger log = LoggerFactory.getLogger(EncryptUntils.class);
    public static String encrypt(String keyStr, String datastr) {
        String s = null;
        try {
            //加密
            Key key = generateKey(keyStr);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] decrypt = cipher.doFinal(datastr.getBytes());
            byte[] decrypt1 = Base64.encodeBase64(decrypt);
            s = new String(decrypt1);
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("加密失败" + e.getMessage());
        }
        return s;
    }
    /**
     * @Description: 解密
     * @author: zhenghao
     * @date: 2019/7/30 15:13
    */
    public static String Decrypt(String keyStr, String datastr) {
        String s = null;
        try {
            Key key = generateKey(keyStr);
            Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher1.init(Cipher.DECRYPT_MODE, key);
            byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr));
             s = new String(decrypt2);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解密失败" + e.getMessage());
        }
       return s;
    }
    private static Key generateKey(String key) throws Exception {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            return keySpec;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String keyStr = "D3BF52E111B8F129";
        String datastr = "q8DtrPAfnJ/awzRnW44ui4YSQ/VIsm/5YdOn9lWFi8f1OTGH+3UNGnZRlRIvUXhTgJu8Y8F9yFIPLftxhgjvYz3cS9qrpo08/8gRT4xtXwFuWse+mc5J9Gt5Qf1U/aDCerV744NB1uzfOaG1umIGemR7vwyNCY88xGw3w0+iIpBNBg+bvbJ5j8GZv+owIkJf+mcUUqVFNXeaO+yFGmHHfg17iIdrSTQRYBAAO9Dx2+/tuvbep8QiXXrl2yMZfrByXooxIGxI1DOxwZl0qskuE/QWb5ePYTdkcdETQz/F1xx/1c9eEN1BGtP4YrVg0EhZx3ZqTlz3fFC4ns/r+8MutnyF2QzVhZLsI1ec1Qd0CbA59A4ivEHpxhmxk61yyhZ7IyxC7UZfS5O8vRVVB7deC33VTyxvCfq/wKnGZnCK2xYH6VVKwvl8GifDVneU57zf0Bi8wlSQ7VR11LwFuom00ICP/aDzKtfxSZtPsELaXkY=";
        try{
            //加密
            Key key = generateKey(keyStr);
//            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//            cipher.init(Cipher.ENCRYPT_MODE, key);
//            byte[] decrypt = cipher.doFinal(datastr.getBytes());
//            byte[] decrypt1 =Base64.encodeBase64(decrypt);
//            System.out.println(new String(decrypt1));
            //解密
            Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher1.init(Cipher.DECRYPT_MODE, key);
            byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr));
            System.out.println(new String(decrypt2));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

8、最后我们将生成xml字符串和约定的加密key传入到加密方法中即可完成加密操作

目录
相关文章
|
4月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
388 5
|
6月前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
246 35
|
8月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
933 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
11月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
421 5
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
2072 2
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
614 0
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
857 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
361 1
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
安全 算法 数据安全/隐私保护
黑客克星!Python加密艺术大公开,AES、RSA双剑合璧,守护你的数字世界
在这个数据泛滥的时代,数字世界既充满了知识,也潜藏安全隐患。Python 作为强大的编程语言,以其独特的加密技术为我们的信息安全保驾护航。本文将介绍 AES 和 RSA 这两种加密算法,揭示它们如何协同工作,保护你的数字世界。AES(高级加密标准)以其高效、安全著称,能将敏感信息转化为难以破解的乱码。Python 的 `pycryptodome` 库让 AES 加密变得简单易行。然而,AES 面临密钥分发难题,此时 RSA(非对称加密算法)便大显身手,通过公钥加密、私钥解密的方式确保密钥传输安全。AES 与 RSA 在 Python 中交织成一道坚不可摧的防护网,共同守护我们的数字世界。
311 0