如何利用 Java 实现 XML 数据的加密与解密

发布时间:2025-02-08 16:10:17 作者:小樊
来源:亿速云 阅读:95

在 Java 中实现 XML 数据的加密和解密,可以使用 Java Cryptography Extension (JCE) 和 Java Architecture for XML Encryption (JAXB) 这两个库

  1. 添加依赖

首先,确保你的项目中已经添加了 JAXB 和 JCE 的依赖。如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- JAXB -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.1</version>
    </dependency>
    <!-- JCE -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.68</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.68</version>
    </dependency>
</dependencies>
  1. XML 加密

以下是一个使用 AES 算法加密 XML 数据的示例:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class XmlEncryption {

    public static void main(String[] args) throws Exception {
        // 创建 XML 数据
        MyData data = new MyData();
        data.setField1("Hello");
        data.setField2("World");

        // 加密 XML 数据
        String encryptedXml = encryptXml(data);
        System.out.println("Encrypted XML: " + encryptedXml);

        // 解密 XML 数据
        MyData decryptedData = decryptXml(encryptedXml);
        System.out.println("Decrypted Data: " + decryptedData);
    }

    public static String encryptXml(MyData data) throws Exception {
        // 生成密钥
        SecretKey secretKey = generateSecretKey();

        // 将 XML 数据转换为字符串
        String xmlString = marshal(data);

        // 加密 XML 字符串
        String encryptedXml = encrypt(xmlString, secretKey);

        // 返回加密后的 XML 字符串
        return encryptedXml;
    }

    public static MyData decryptXml(String encryptedXml) throws Exception {
        // 生成密钥
        SecretKey secretKey = generateSecretKey();

        // 解密 XML 字符串
        String decryptedXml = decrypt(encryptedXml, secretKey);

        // 将解密后的 XML 字符串转换回 Java 对象
        return unmarshal(decryptedXml);
    }

    private static SecretKey generateSecretKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        return keyGenerator.generateKey();
    }

    private static String marshal(MyData data) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(MyData.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(data, stringWriter);
        return stringWriter.toString();
    }

    private static <T> T unmarshal(String xmlString, Class<T> clazz) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        StringReader stringReader = new StringReader(xmlString);
        return clazz.cast(unmarshaller.unmarshal(stringReader));
    }

    private static String encrypt(String data, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    private static String decrypt(String encryptedData, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
}
  1. XML 解密

在上面的示例中,我们已经实现了 XML 数据的加密和解密。encryptXml 方法用于加密 XML 数据,decryptXml 方法用于解密 XML 数据。注意,这里的示例使用了 AES 算法,你可以根据需要选择其他加密算法。

注意:这个示例仅用于演示目的,实际应用中可能需要考虑更多的安全因素,例如密钥管理、加密模式等。在实际项目中,建议使用成熟的加密库,如 Bouncy Castle,以提供更安全的加密解决方案。

推荐阅读:
  1. unix下利用openssl对大文件进行aes加解密
  2. weblogic利用小技巧

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java XML 验证机制是如何工作的

下一篇:如何使用 Java JSON Parser 解析复杂 JSON

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》