Java语言的特性-五、安全性

1、字节码验证

类加载阶段会对字节码进行验证,JVM会检查字节码是否符合Java语言规范,防止恶意代码通过篡改字节码来破坏系统安全。

2、安全管理器(Security Manager)

可以限制对本地文件系统、网络等资源的访问。

3、加密和数字签名技术

对存储和传输中的数据进行加密,保护数据存储和数据传输安全。
示例代码:使用RSA算法对数据进行非对称加密,公钥用于加密,私钥用于解密。

package com.xiaobai.java_core.encrypt;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ArrayUtils;
import org.junit.jupiter.api.Test;

import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;

/**
 * @Author 王天文
 * @Date 2024/12/7 21:23
 * @Description: 加解密算法
 */
@Slf4j
public class EncryptTest {

    @Test
    public void rsaTest() throws Exception {

        // 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // 公钥
        PublicKey publicKey = keyPair.getPublic();
        int publicBlockSize = publicKey.getEncoded().length;
        // 私钥
        PrivateKey privateKey = keyPair.getPrivate();
        int privateBlockSize = privateKey.getEncoded().length;

        // 创建公钥加密器
        Cipher publicCipher = Cipher.getInstance("RSA");
        publicCipher.init(Cipher.ENCRYPT_MODE, publicKey);
        // 使用公钥对数据进行加密
        byte[] encryptData = new byte[0];
        String plaintext = "This is a test message for RSA encryption and decryption.";
        byte[] data = plaintext.getBytes();
        for (int i = 0; i < data.length; i+=publicBlockSize) {
            byte[] dataI = publicCipher.doFinal(ArrayUtils.subarray(data, i, i + publicBlockSize));

            byte[] encryptTempData = new byte[encryptData.length + dataI.length];
            System.arraycopy(encryptData, 0, encryptTempData, 0, encryptData.length);
            System.arraycopy(dataI, 0, encryptTempData, encryptData.length, encryptTempData.length);
            encryptData = encryptTempData;
        }

        String encryptDataStr = Base64.getEncoder().encodeToString(encryptData);
        log.info("加密后的数据:{}", encryptDataStr);

        // 创建私钥加密器
        Cipher privateCipher = Cipher.getInstance("RSA");
        privateCipher.init(Cipher.DECRYPT_MODE, privateKey);
        // 使用私钥对数据进行解密
        byte[] decipherData = new byte[0];
        byte[] waitDecipherData = Base64.getDecoder().decode(encryptDataStr);
        for (int i = 0; i < waitDecipherData.length; i+=privateBlockSize) {
            byte[] dataI = privateCipher.doFinal(ArrayUtils.subarray(waitDecipherData, i, i + privateBlockSize));

            byte[] decipherTempData = new byte[decipherData.length + dataI.length];

            System.arraycopy(decipherData, 0, decipherTempData, 0, decipherData.length);
            System.arraycopy(dataI, 0, decipherTempData, decipherData.length, dataI.length);
            decipherData = decipherTempData;
        }

        log.info("解密后数据:{}", new String(decipherData));


    }
}

上一篇:密码学——密码学基础、散列函数与数字签名


下一篇:网络安全——防火墙