1. 加密技术的类型
加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密),加密技术的要点是加密算法,加密算法可以分为三类:
- 对称加密,如AES
-
- 基本原理:将明文分成N个组,然后使用密钥对各个组进行加密,形成各自的密文,最后把所有的分组密文进行合并,形成最终的密文。
- 优势:算法公开、计算量小、加密速度快、加密效率高
- 缺陷:双方都使用同样密钥,安全性得不到保证
- 非对称加密,如RSA
-
- 基本原理:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端
-
-
- 私钥加密,持有公钥可以解密
- 公钥加密,持有私钥可以解密
- 私钥加密,私钥无法解密,只能是公钥解密
- 公钥加密,公钥无法解密,只能是私钥解密
-
-
- 优点:安全,难以破解
- 缺点:算法比较耗时
- 不可逆加密,如MD5,SHA
-
- 基本原理:加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,无法根据密文推算出明文。
2. RSA加密
测试代码:
package com.tanhua.sso;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.junit.Assert;
import org.junit.Test;
public class TestRSA {
@Test
public void testRSA() {
RSA rsa = new RSA();
// //获得私钥
// rsa.getPrivateKey()
System.out.println("私钥: " + rsa.getPrivateKeyBase64());
// //获得公钥
// rsa.getPublicKey()
System.out.println("公钥: " + rsa.getPublicKeyBase64());
//公钥加密,私钥解密
byte[] encrypt = rsa.encrypt(StrUtil.bytes("测试代码", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
Assert.assertEquals("测试代码", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
//私钥加密,公钥解密
byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("测试代码", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey);
Assert.assertEquals("测试代码", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8));
}
}