java.security 包是 Java 标准库中用于实现安全功能的核心包,提供了加密、数字签名、消息摘要、密钥管理、访问控制等安全服务。
1、消息摘要 (MessageDigest) - 生成数据的哈希值
2、数字签名 (Signature) - 创建和验证数字签名
3、密钥管理 (Key, KeyPair, KeyStore) - 管理加密密钥
4、加密/解密 (Cipher) - 数据加密和解密操作
5、安全随机数 (SecureRandom) - 生成加密安全的随机数
6、权限控制 (Permission, Policy) - 访问控制和安全策略
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MessageDigestExample {
public static void main(String[] args) {
try {
String input = "Hello, World!";
// 创建 MD5 消息摘要实例
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] md5Hash = md5.digest(input.getBytes());
System.out.println("MD5: " + bytesToHex(md5Hash));
// 创建 SHA-256 消息摘要实例
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
byte[] sha256Hash = sha256.digest(input.getBytes());
System.out.println("SHA-256: " + bytesToHex(sha256Hash));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// 将字节数组转换为十六进制字符串
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}import java.security.*;
import java.util.Base64;
public class DigitalSignatureExample {
public static void main(String[] args) {
try {
String message = "重要数据需要签名";
// 生成密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// 创建签名对象
Signature signature = Signature.getInstance("SHA256withRSA");
// 使用私钥签名
signature.initSign(privateKey);
signature.update(message.getBytes());
byte[] digitalSignature = signature.sign();
System.out.println("签名: " + Base64.getEncoder().encodeToString(digitalSignature));
// 使用公钥验证签名
signature.initVerify(publicKey);
signature.update(message.getBytes());
boolean verified = signature.verify(digitalSignature);
System.out.println("签名验证结果: " + verified);
} catch (Exception e) {
e.printStackTrace();
}
}
}import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
import java.util.Base64;
public class EncryptionExample {
public static void main(String[] args) {
try {
String plainText = "敏感数据需要加密";
// 生成 AES 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128, new SecureRandom());
SecretKey secretKey = keyGen.generateKey();
// 加密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("加密后: " + encryptedText);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("解密后: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}import java.security.SecureRandom;
public class SecureRandomExample {
public static void main(String[] args) {
SecureRandom secureRandom = new SecureRandom();
// 生成随机字节
byte[] randomBytes = new byte[16];
secureRandom.nextBytes(randomBytes);
System.out.println("随机字节: " + bytesToHex(randomBytes));
// 生成随机整数
int randomInt = secureRandom.nextInt();
System.out.println("随机整数: " + randomInt);
// 生成指定范围的随机数
int randomInRange = secureRandom.nextInt(100);
System.out.println("0-99范围内的随机数: " + randomInRange);
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
public class KeyStoreExample {
public static void main(String[] args) {
try {
// 加载密钥库
KeyStore keyStore = KeyStore.getInstance("JKS");
char[] password = "password".toCharArray();
FileInputStream fis = new FileInputStream("keystore.jks");
keyStore.load(fis, password);
fis.close();
// 获取别名
String alias = keyStore.aliases().nextElement();
System.out.println("密钥别名: " + alias);
// 获取私钥
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);
System.out.println("私钥算法: " + privateKey.getAlgorithm());
// 获取证书
Certificate certificate = keyStore.getCertificate(alias);
System.out.println("证书类型: " + certificate.getType());
} catch (Exception e) {
e.printStackTrace();
}
}
}1、算法选择: 在实际应用中,应避免使用弱算法如 MD5,推荐使用 SHA-256 或更强的哈希算法
2、密钥管理: 密钥应该安全存储,不要硬编码在代码中
3、异常处理: 安全操作可能抛出多种异常,需要适当处理
4、性能考虑: 加密操作可能消耗较多资源,需要根据应用场景选择合适的算法
这些示例展示了 java.security 包的基本用法,在实际应用中还需要考虑更多的安全最佳实践和错误处理机制。