§ 本文目标
了解系统提供的基础加解密工具,不同算法的使用,以及应用场景
§ 练习场景
基于RSA的加解密开发
§ 操作步骤
§ jks证书准备
创建.jks文件,请按以下内容进行
您可以使用Java的keytool按以下命令生成证书
keytool -genkey -alias "myjks" -keyalg "RSA" -keystore "e:\temp\test.jks" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass "123456" -storepass "123456" -validity 180
其中:
-alias的abc代表密钥对别名,与配置中的jwt-keystore.key-pair-name对应
-validity的 200代表证书有效期是多少天(默认 90)
-keysize的2048代表密钥长度(默认 1024)
执行命令后,会有以下交互式内容请按需填写。
交互文字:
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: tester
您的组织单位名称是什么?
[Unknown]: YUSYS
您的组织名称是什么?
[Unknown]: YUSYS
您所在的城市或区域名称是什么?
[Unknown]: BJ
您所在的省/市/自治区名称是什么?
[Unknown]: BJ
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=tester, OU=YUSYS, O=YUSYS, L=BJ, ST=BJ, C=CN是否正确?
[否]: Y
输入 <myjks> 的密钥口令
(如果和密钥库口令相同, 按回车):
输入的密钥库口令与配置中的jwt-keystore.password对应,最后一步的输入 <myjks> 的密钥口令 (如果和密钥库口令相同, 按回车):请直接按回车键即可,之后将会在改目录下生成一个新的名为keystore2.jks证书。
使用一下命令可以查看证书信息:
keytool -list -v -keystore keystore.jks
导出cert证书
keytool -export -alias myjks -keystore e:\temp\test.jks -file e:\temp\testcert.cer -storepass 123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
§ RSA开发示例
package cn.com.yusys.yusp.commons.util;
import java.security.PrivateKey;
import java.security.PublicKey;
import cn.com.yusys.yusp.util.BCRSAUtil;
import org.apache.logging.log4j.util.Base64Util;
/**
* BCRSAUtil工具类测试.
*
* <p>
* resources/cert/如果没有或者为空,测试会有异常信息,可忽略
*
*
* @since 2.1.1
*/
public class RsaTest {
/**
* 直接读取进行加解密.
*
* @throws Exception
*/
public static void testJks() throws Exception {
String orgString = "admin";// 原文本
/**
* 1.jks文件读取
*/
PrivateKey privateKey = BCRSAUtil.getPrivateKeyFromStore("e:/temp/test.jks", "myjks", null, "123456");
PublicKey publicKey = BCRSAUtil.getPublicKeyFromCrt("e:/temp/testcert.cer");
byte[] publicKeyBytes = publicKey.getEncoded();
byte[] privateKeyBytes = privateKey.getEncoded();
/**
* 2.通过公钥加密 私钥解密
*/
byte[] encodedData = BCRSAUtil.encryptByPub(orgString.getBytes(),
Base64Util.encodeToString(publicKeyBytes, false));
String decryptStringA = new String(BCRSAUtil.decrypt(privateKey, encodedData));
System.out.println("原值:" + orgString);
System.out.println("公钥加密,私钥解密后:" + decryptStringA);
/**
* 3.通过私钥加密 公钥解密
*/
byte[] encodedDataB = BCRSAUtil.encryptByPrivate(orgString.getBytes(), privateKeyBytes);
System.out.println("原值:" + orgString);
System.out.println("加密后:" + encodedDataB);
String decryptStringB = new String(BCRSAUtil.decrypt(publicKey, encodedDataB));
System.out.println("私钥加密,公钥解密后:" + decryptStringB);
}
/**
* 文件创建.
* <p>
* 文件创建到resources/cert/目录下
*
* @throws Exception
*/
public static void testCreateFile() throws Exception {
/**
* 1.jks文件读取
*/
PrivateKey privateKey = BCRSAUtil.getPrivateKeyFromStore("e:/temp/test.jks", "myjks", null, "123456");
PublicKey publicKey = BCRSAUtil.getPublicKeyFromCrt("e:/temp/testcert.cer");
/**
* 2.创建key文件
*/
BCRSAUtil.createPublicKeyFile(publicKey,
"E:\\space_ide\\workspace\\yusp-common\\yusp-common-base\\src\\test\\resources\\cert\\pwd_public.key");
BCRSAUtil.createPrivateKeyFile(privateKey,
"E:\\space_ide\\workspace\\yusp-common\\yusp-common-base\\src\\test\\resources\\cert\\pwd_private.key");
System.out.println("完成文件创建");
}
/**
* 通过key加解密.
* <p>
* 注意,该测试,默认读取两个文件: resources/cert/pwd_private.key resources/cert/pwd_public.key
*
*/
public static void testKeyFile() throws Exception {
String orgString = "admin";
String encryptString = BCRSAUtil.encryptByPub(orgString);
String decryptString = BCRSAUtil.decryptByPrivate(encryptString);
System.out.println("原值:" + orgString);
System.out.println("解密后:" + decryptString);
}
public static void main(String[] args) throws Exception {
System.out.println("测试1:JKS解析,加解密测试-----------------");
testJks();
System.out.println("测试2:Key文件创建-----------------");
testCreateFile();
System.out.println("测试3:Key文件加解密,加解密测试-----------------");
testKeyFile();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
§ 测试结果
测试1:JKS解析,加解密测试-----------------
原值:admin
公钥加密,私钥解密后:admin
原值:admin
加密后:[B@6928f576
私钥加密,公钥解密后:admin
测试2:Key文件创建-----------------
完成文件创建
测试3:Key文件加解密,加解密测试-----------------
原值:admin
解密后:admin
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
§ 常用加解密工具
§ AES
AESUtil
/**
* 加密
*
* @param content
* 需要加密的内容
* @param password
* 加密密码
* @return
*/
public static void encryptAes(InputStream is, OutputStream out, byte[] password) throws Exception ;
/**
* 解密
*
* @param content
* 待解密内容
* @param password
* 解密密钥
* @return
*/
public static void decryptAes(InputStream is, OutputStream out, byte[] password) throws Exception ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
§ 3DES
ThreeDESUtil
**
* ECB加密.
*
* @param key
* @param data
* @return Base64编码的密文
* @throws Exception
*/
public static byte[] des3EncodeECB(byte[] key, byte[] data);
/**
* ECB解密.
*
* @param key
* @param data
* @return 明文
* @throws Exception
*/
public static byte[] des3DecodeECB(byte[] key, byte[] data);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
§ DES
DesUtil
/**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
public static String encrypt(String data, String key);
/**
* Description 根据键值进行解密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
§ MD5
/**
* MD5加密.
* @param content
* 需要加密的内容
* @return 密文
* @throws Exception
*/
public static String stringToMD5(String content)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
§ 国密SM2
SM2Util
§ 国密SM3
SM3Util
§ 国密SM4
SM4Util
§ Spring安全框架默认密码加载工具
BCryptPasswordEncoder
RSA加密
String password = BCRSAUtil.encryptByRSA("我是明文")
RSA私钥解密:
String password1 = BCRSAUtil.decrypt(password );
1
2
3
4
2
3
4