Java中常见的加密函数有哪些?如何使用它们?
发布时间:2023-06-06 01:30:18
Java中常见的加密函数包括消息摘要函数(Message Digest)、对称加密函数、不对称加密函数和数字签名函数。
消息摘要函数是一种用于验证数据完整性的加密函数,也称为哈希函数,它将任意长度的数据映射为固定长度的哈希值,可以用于常见的数据验证场景,如密码存储、用户身份验证等。Java中常见的消息摘要函数包括MD5和SHA。使用方式如下:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class MessageDigestDemo {
public static void main(String[] args) throws NoSuchAlgorithmException {
// 创建MessageDigest对象
MessageDigest md5 = MessageDigest.getInstance("MD5");
String password = "123456";
// 更新数据
md5.update(password.getBytes());
// 计算哈希值
byte[] digest = md5.digest();
// 对哈希值进行Base64编码
String base64 = Base64.getEncoder().encodeToString(digest);
System.out.println(base64);
}
}
对称加密函数是一种加密算法,使用相同的密钥对数据进行加密和解密。Java中常见的对称加密函数包括AES和DES。使用方式如下:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESEncryptDemo {
public static void main(String[] args) throws Exception {
// 生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
// 创建SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
// 创建Cipher对象
Cipher cipher = Cipher.getInstance("AES");
// 加密
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
String data = "hello";
byte[] encryptBytes = cipher.doFinal(data.getBytes());
String base64 = Base64.getEncoder().encodeToString(encryptBytes);
System.out.println(base64);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(base64));
String decryptData = new String(decryptBytes);
System.out.println(decryptData);
}
}
不对称加密函数是一种使用公钥和私钥进行加密和解密的算法,公钥用于加密数据,私钥用于解密数据。Java中常见的不对称加密函数包括RSA。使用方式如下:
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryptDemo {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512); // 指定密钥长度
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
String data = "hello";
byte[] encryptBytes = cipher.doFinal(data.getBytes());
String base64 = Base64.getEncoder().encodeToString(encryptBytes);
System.out.println(base64);
// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(base64));
String decryptData = new String(decryptBytes);
System.out.println(decryptData);
}
}
数字签名函数是一种用于确保数据完整性和验证数据来源的函数,它将哈希值和私钥组成的数字签名附加在数据中,接收方使用公钥验证数据完整性和来源。Java中常见的数字签名函数包括DSA和RSA。使用方式如下:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;
public class SignatureDemo {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512); // 指定密钥长度
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 签名
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
String data = "hello";
signature.update(data.getBytes());
byte[] signBytes = signature.sign();
String base64 = Base64.getEncoder().encodeToString(signBytes);
System.out.println(base64);
// 验证签名
signature.initVerify(publicKey);
signature.update(data.getBytes());
boolean verify = signature.verify(Base64.getDecoder().decode(base64));
System.out.println(verify);
}
}
