什么是数据加密与解密
数据加密与解密是指在计算机系统内,将明文转换成密文的过程称为加密,将密文转换成明文的过程称为解密。数据加密是指将原来的数据按照一定的算法重新组合和变换,使其不易被未经授权的人所窥探、避免信息泄露、防止所传送内容被篡改,确保信息的机密性和完整性。
数据加密的目的是为了防止信息泄露,保证信息的机密性和完整性。数据加密目前广泛应用于网络通信、文件加密、数据库加密等领域。
常见的加密方式
对称加密
对称加密是一种加密方式,即指加密和解密使用的密钥相同。在对称加密中,数据发送方使用加密算法将明文加密,生成密文,然后将密文发送给数据接收方。数据接收方使用相同的密钥和解密算法,将密文解密为明文。
对称加密的优点:加解密速度快;
对称加密的缺点:密钥传输问题,如何安全地将密钥传输给数据接收方;
非对称加密
非对称加密是指加密和解密使用不同的密钥。在非对称加密中,数据发送方使用接收方的公钥进行加密,数据接收方使用自己的私钥进行解密。
非对称加密的优点:密钥传输安全;
非对称加密的缺点:加解密速度较慢。
Java中的加密方式
MD5加密
MD5是一种单向加密方式,不可逆,无法解密。在Java中,可以使用java.security.MessageDigest类进行加密。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
public static String encrypt(String input) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(input.getBytes());
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
result.append("0").append(temp);
} else {
result.append(temp);
}
}
return result.toString();
}
}
代码解释:
使用MessageDigest.getInstance("MD5")获取MD5加密类的实例;
使用md5.digest(input.getBytes())方法进行加密,返回字节数组;
字节数组转换成十六进制字符串。
AES加密
AES是一种对称加密方式,在Java中可以使用javax.crypto包中的类进行加密和解密。
代码示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";// 默认的加密算法
/**
* 初始化密钥
*
* @return byte[] 密钥
* @throws Exception
*/
public static byte[] initSecretKey() throws Exception {
//返回生成指定算法的秘密密钥的 KeyGenerator 对象
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
//AES 要求密钥长度为 128
kg.init(128);
//生成一个密钥
SecretKey secretKey = kg.generateKey();
return secretKey.getEncoded();
}
/**
* AES 加密操作
*
* @param content 待加密内容
* @param key 密钥
* @return byte[] 加密字节数组
* @throws Exception
*/
public static byte[] encrypt(byte[] content, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器
SecretKeySpec sks = new SecretKeySpec(key, KEY_ALGORITHM);// 初始化为加密模式的密码器
cipher.init(Cipher.ENCRYPT_MODE, sks);// 加密操作
return cipher.doFinal(content);// 分组加密
}
/**
* AES 解密操作
*
* @param content 待解密内容
* @param key 密钥
* @return byte[] 解密字节数组
* @throws Exception
*/
public static byte[] decrypt(byte[] content, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器
SecretKeySpec sks = new SecretKeySpec(key, KEY_ALGORITHM);// 初始化为解密模式的密码器
cipher.init(Cipher.DECRYPT_MODE, sks);// 解密操作
return cipher.doFinal(content);// 分组解密
}
/**
* 将byte[]转成base64编码的字符串
*
* @param bytes
* @return
*/
public static String encode(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
/**
* 将base64编码的字符串转成byte[]
*
* @param str
* @return
* @throws Exception
*/
public static byte[] decode(String str) throws Exception {
return Base64.getDecoder().decode(str);
}
}
代码解释:
使用javax.crypto.KeyGenerator类生成128位的密钥;
使用javax.crypto.Cipher类进行AES加解密操作,初始化方式为AES/ECB/PKCS5Padding;
字节数组使用java.util.Base64类进行编码和解码;
表单数据的加密与解密实现
在Web开发中,表单数据的传输往往需要进行加密,以防止数据泄露。下面我们将讲解如何使用Java实现表单数据的加密和解密。
表单数据的加密
具体步骤:
获取表单数据,如用户名和密码;
使用java.util.Base64类对表单数据进行编码;
使用Java加密方式对编码后的数据进行加密。
代码示例:
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class EncryptUtil {
private static final String AES = "AES";
private static final String KEY = "your_key_here";
/**
* 使用AES算法加密数据
*
* @param data 待加密的数据
* @return 返回加密后的字节数组
*/
public static byte[] encryptData(String data) throws Exception {
Key key = generateKey();
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedByteValue = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encode(encryptedByteValue);
}
/**
* 使用AES算法解密数据
*
* @param encryptedData 已加密的数据
* @return 返回解密后的字符串
*/
public static String decryptData(String encryptedData) throws Exception {
Key key = generateKey();
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decodedValue = Base64.getDecoder().decode(encryptedData);
byte[] decryptedValue = cipher.doFinal(decodedValue);
return new String(decryptedValue, StandardCharsets.UTF_8);
}
/**
* 使用给定的加密密钥生成一个密钥对象
*
* @return 返回密钥对象
*/
private static Key generateKey() {
return new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), AES);
}
}
代码解释:
AES加密使用的密钥是一个字符串,需要转换成Key类;
使用javax.crypto.Cipher类进行AES加解密操作,初始化方式为AES;
字节数组使用java.util.Base64类进行编码和解码。
表单数据的解密
具体步骤:
获取加密后的表单数据;
使用Java解密方式对数据进行解密;
使用java.util.Base64类对解密后的数据进行解码。
代码示例:
import java.nio.charset.StandardCharsets;
public class DecryptUtil {
public static void main(String[] args) throws Exception {
String encryptedData = "encrypted-data-goes-here";
String decryptedData = EncryptUtil.decryptData(encryptedData);
System.out.println("Decrypted Data: " + decryptedData);
}
}
代码解释:
获取加密后的表单数据;
调用EncryptUtil中的decryptData方法进行解密;
使用java.nio.charset.StandardCharsets.UTF_8编码格式将解密后的数据转换成字符串。
总结
本文介绍了数据加密与解密的概念、常见的加密方式以及Java中的加密方式,并以实现表单数据的加密和解密为例,给出了Java代码示例。数据加密和解密是保证数据安全的重要手段,我们应该根据情况选取适合的加密方式。