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));
}
}