§ 本文目标

了解系统提供的基础加解密工具,不同算法的使用,以及应用场景

§ 练习场景

基于RSA的加解密开发

§ 操作步骤

§ jks证书准备

创建.jks文件,请按以下内容进行

您可以使用Javakeytool按以下命令生成证书

 	 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

§ 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

§ 测试结果

 测试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

§ 常用加解密工具

§ 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

§ 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

§ 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

§ MD5

/**
     * MD5加密.
     * @param content
     *            需要加密的内容
     * @return 密文
     * @throws Exception
     */
    public static String stringToMD5(String content)
1
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

§ 应用场景

§ 登录密码非对称加密

§ application配置文件使用des加密

最后更新于: 4/28/2022, 4:58:56 PM