一、加密的作用
加密解密算法在信息安全领域有着广泛的应用。加密的作用主要有以下几点:
1、保障数据的机密性
在信息传输和存储过程中,加密可以保障数据的机密性,确保数据只能被授权人员获取和使用。
2、防止数据被篡改
加密可以使用消息摘要算法对数据做哈希处理,生成一个唯一的摘要值,通过对比摘要值可以验证数据是否被篡改过。
3、确保数据的完整性
加密可以使用数字签名算法对数据进行签名,确保数据的完整性和来源的可靠性。
4、防止抵赖
数字签名和消息摘要算法都可以用于证明某个数据是由某个人或系统生成的,可以有效防止抵赖行为。
5、保护隐私
加密可以保护个人隐私,例如个人身份证号码、银行卡号、密码等敏感信息在传输和存储时使用加密算法进行加密,防止身份泄露和账号被盗用。
总之,加密在信息安全领域有着重要的作用,是保障数据安全的重要手段之一。但需要注意的是,加密并不能完全消除安全隐患,因此在实际应用中需要考虑安全的全链路问题。
二、java的常用加密算法
1、对称加密算法
对称加密算法使用同一个密钥对数据进行加密和解密,常用的有DES、3DES、AES等。
2、非对称加密算法
非对称加密算法使用一对密钥(公钥和私钥)对数据进行加密和解密,常用的有RSA、DSA、ECC等。
3、消息摘要算法
消息摘要算法是一种单向加密算法,将任意长度的数据转换成固定长度的输出,常用的有MD5、SHA-1、SHA-2等。
4、数字签名算法
数字签名算法是将消息或数据进行哈希计算,然后用私钥签名,验证签名时使用公钥进行验证,常用的有RSA、DSA等。
5、密钥交换算法
密钥交换算法是指在不安全的通道上,通过某种算法交换一个密钥,常用的有Diffie-Hellman(DH)算法、椭圆曲线Diffie-Hellman(ECDH)算法等。
Java中的加密解密算法都可以在javax.crypto包里找到对应的类
三、使用AES实现加密解密
这里就使用AES作为例子,实现对数据的加密解密,代码如下:
package com.hmblogs.backend.util;
import org.junit.jupiter.api.Test;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
/**
* Java使用AES加密算法进行加密解密
* */
public class AESUtil {
private static final String key="20230610HelloDog";
/**
* AES算法加密
* @Param:text原文
* @Param:key密钥
* */
public static String AESEncrypt(String text) throws Exception {
// 创建AES加密算法实例(根据传入指定的秘钥进行加密)
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
// 初始化为加密模式,并将密钥注入到算法中
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
// 将传入的文本加密
byte[] encrypted = cipher.doFinal(text.getBytes());
//生成密文
// 将密文进行Base64编码,方便传输
return Base64.getEncoder().encodeToString(encrypted);
}
/**
* AES算法解密
* @Param:base64Encrypted密文
* @Param:key密钥
* */
public static String AESDecrypt(String base64Encrypted)throws Exception{
// 创建AES解密算法实例
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
// 初始化为解密模式,并将密钥注入到算法中
cipher.init(Cipher.DECRYPT_MODE, keySpec);
// 将Base64编码的密文解码
byte[] encrypted = Base64.getDecoder().decode(base64Encrypted);
// 解密
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted);
}
@Test
public void AESTest() throws Exception {
//明文
String text="123123";
//秘钥(需要使用长度为16、24或32的字节数组作为AES算法的密钥,否则就会遇到java.security.InvalidKeyException异常)
//加密,生成密文
String base64Encrypted = AESEncrypt(text);
System.out.println(base64Encrypted);
//解密,获取明文
String text2 = AESDecrypt(base64Encrypted);
System.out.println(text2);
}
}
运行结果如下: