一、对称加密算法
加密和解密使用相同密钥的加密算法。常用的算法包括DES、3DES、AES、DESX、Blowfish、RC4、RC5、RC6。
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,速度快,安全级别高【128位秘钥】;
二、非对称加密算法
加密和解密使用不同密钥的加密算法,也称为公私钥加密。常见的算法包括RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;【建议1024位秘钥】
DSA:数字签名算法,是一种标准的 DSS(数字签名标准)
ECC:椭圆曲线密码编码学【建议160位秘钥】。
ECC VS RSA
1)抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
2)计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
3)存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
4)带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
三、散列算法
除法散列法 平方散列法 斐波那契(Fibonacci)散列法 随机数法
单向散列函数一般用于产生消息摘要,密钥加密等,常用的算法包括MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。
MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
SHA-1 VS MD5 [二者均由MD4导出]
1)SHA-1摘要比MD5摘要长32位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^(128)数量级的操作,而对SHA-1则是2^(160)数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2)MD5易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3)在相同的硬件上,SHA-1的运行速度比MD5慢。
四、加密算法的选择
1.单方密码存储建议直接使用散列算法(MD5即可,配合密码更新策略)。
2.内部信息加密传输建议使用对称加密效率跟高(AES)。
3.外部数据传输建议使用非对称加密,秘钥保存更安全(RSA)。
4.HTTPS高级用法:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
五、上源码
5.1 AES对称加密
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
/**
* <p>
* AES加密工具
* </p>
*
* @author ocean
* @version 1.0.0
* @date 2023/5/4 14:51
*/
@Slf4j
public class AESUtils {
// 秘钥 16
private static final String SECRET_KEY = "1111111111111111";
// 秘钥 24
//private static final String SECRET_KEY = "111111111111111122222222";
// 秘钥 32
//private static final String SECRET_KEY = "11111111111111112222222233333333";
// 算法
private static final String ALGORITHM = "AES";
private static final String UTF8 = StandardCharsets.UTF_8.name();
/**
* 字符串加密
*
* @param message 明文字符串
* @param secretKey 秘钥
* @r