可逆与不可逆算法,对称加密与非对称加密算法总结
文章目录
1. 加密算法的种类
2. 不可逆加密算法
①:MD5
②:HMAC系列
③:SHA系列
3. 可逆加密算法
1. 对称加密
①:DES
②:3DES
③:AES
2. 非对称加密
①:RSA
4. Base64编码
5. BCrypt
1. 加密算法的种类
加密算法分为可逆、不可逆加密算法。而不可逆加密算法又分为对称加密和非对称加密
不可逆加密:不可逆加密算法最大的特点就是不需要密钥,但是HMAC是需要密钥的!
常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512。其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。
由于这些加密都是不可逆的,因此比较常用的场景就是用户密码加密,其验证过程就是通过比较两个加密后的字符串是否一样来确认身份的。网上也有很多自称是可以破解MD5密码的网站,其原理也是一样,就是有一个巨大的资源库,存放了许多字符串及对应的MD5加密后的字符串,通过你输入的MD5加密串来进行比较,如果过你的密码复杂度比较低,还是有很大机率验证出来的。
可逆加密:数据的加密和解密都需要使用秘钥操作
对称加密:常见的对称加密算法有DES、3DES、AES128、AES192、AES256
非对称加密 :常见的非对称加密有RSA、SM2,RS256 (采用SHA-256 的 RSA 签名)
Base64转码:把字符串转换成以“==”结尾的字符串。如:Z38cPD5XbiPZ41LKQmhZAw==!
2. 不可逆加密算法
①:MD5
MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5算法有以下特点:
压缩性:无论数据长度是多少,计算出来的MD5值长度相同
容易计算性:由原数据容易计算出MD5值
抗修改性:即便修改一个字节,计算出来的MD5值也会巨大差异
抗碰撞性:知道数据和MD5值,很小概率找到相同MD5值相同的原数据。
public static String md5(String text) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] bytes = messageDigest.digest(text.getBytes());
//也可以使用base64转码成字符串
// return Base64.getEncoder().encodeToString(bytes);
//使用 Hex转码
return Hex.encodeHexString(bytes);
}
②:HMAC系列
HMAC算法更像是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的Hash算法。 HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。
public static String hmacSha256(String text, SecretKeySpec sk) {
Mac mac = null;
try {
mac = Mac.getInstance("HmacSHA256");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
mac.init();
} catch (Exception e) {
e.printStackTrace();
}
byte[] rawHmac = mac.doFinal(text.getBytes());
return Base64.getEncoder().encodeToString(rawHmac);
}
③:SHA系列
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。SHA-1加密算法有碰撞的可能性,虽然很小。
public static String sha256(String text) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] bytes = messageDigest.digest(text.getBytes());
return Hex.encodeHexString(bytes);
}
3. 可逆加密算法
可逆加密算法又分为 对称加密 和 分对称加密
1. 对称加密
对称加密算法是应用比较早的算法,在数据加密和解密的时用的都是同一个密钥,这就造成了密钥管理困难的问题。常见的对称加密算法有DES、3DES、AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。其中AES后面的数字代表的是密钥长度。对称加密算法的安全性相对较低,比较适用的场景就是内网环境中的加解密。
①:DES
DES是对称加密算法领域中的典型算法,其密钥默认长度为56位。
// 加密
public static String encrypt(byte[] dataSource, String password){
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
cipher