keystore生成存储AES密钥文件
参考
https://www.cnblogs.com/f1194361820/p/4266511.html
https://blog.csdn.net/lishizhen1991/article/details/78195305
https://blog.csdn.net/sunqiujing/article/details/81938319
一、cmd命令生成
a. 找到并进入到jre的bin文件夹
C:\Users\ge-ji>where java
C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe
D:\Program Files\Java\jdk1.8.0_181\bin\java.exe
D:\Program Files\Java\jdk1.8.0_181\jre\bin\java.exe
C:\Users\ge-ji>d:
D:\>cd Program Files\Java\jdk1.8.0_181\bin
D:\Program Files\Java\jdk1.8.0_181\bin>
b.创建keystore
D:\Program Files\Java\jdk1.8.0_181\jre\bin>keytool -genseckey -keystore testkeystore.keystore -storetype JCEKS -keyalg AES -keysize 128 -alias testalias
输入密钥库口令:
再次输入新口令:
输入 <testalias> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
Warning:
JCEKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore testkeystore.keystore -destkeystore testkeystore.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
D:\Program Files\Java\jdk1.8.0_181\jre\bin>
命令解析
option | 含义 |
---|---|
-alias | 要处理的条目的别名 |
-keypass | 密钥口令 |
-keyalg | 密钥算法名称 |
-keysize | 密钥位大小 |
-keystore | 密钥库名称 |
-storepass | 密钥库口令 |
-storetype | 密钥库类型,JKS、JCEKS、PKCS12、BKS、UBER |
-providername | 提供方名称 |
-providerclass | 提供方类名 |
-providerarg | 提供方参数 |
-providerpath | 提供方类路径 |
-v | 详细输出 |
-protected | 通过受保护的机制的口令 |
c.查看keystore
D:\Program Files\Java\jdk1.8.0_181\jre\bin>keytool -list -keystore testkeystore.keystore -storetype JCEKS -keyalg AES -v
输入密钥库口令:
密钥库类型: JCEKS
密钥库提供方: SunJCE
您的密钥库包含 1 个条目
别名: testalias
创建日期: 2021-8-18
条目类型: SecretKeyEntry
*******************************************
*******************************************
Warning:
JCEKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore testkeystore.keystore -destkeystore testkeystore.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
D:\Program Files\Java\jdk1.8.0_181\jre\bin>
命令解析:
option | 含义 |
---|---|
-rfc | 以 RFC 样式输出 |
-alias | 要处理的条目的别名 |
-keystore | 密钥库名称 |
-storepass | 密钥库口令 |
-storetype | 密钥库类型 |
-providername | 提供方名称 |
-providerclass | 提供方类名 |
-providerarg | 提供方参数 |
-providerpath | 提供方类路径 |
-v | 详细输出 |
-protected | 通过受保护的机制的口令 |
二、Java代码生成
import lombok.extern.slf4j.Slf4j;
import javax.crypto.KeyGenerator;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.KeyStore;
import java.security.SecureRandom;
/**
*
* * @Title:
* * @Description:
* * @author
* * @date 2021/2/17 17:28
*
*/
@Slf4j
public class TestKeystore3 {
public static void main(String[] args) {
initKeyStoreNew();
}
/**
* 生成密钥文件
*/
public static void initKeyStoreNew() {
try {
KeyStore keyStore = KeyStore.getInstance("JCEKS");
keyStore.load(null, null);
// 通过指定算法,指定提供者来构造KeyGenerator对象
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
String password="admin123";
SecureRandom secureRandom = new SecureRandom(password.getBytes(StandardCharsets.UTF_8));
// 初始化KeyGenerator对象,通过指定大小和随机源的方式产生
keyGen.init(128, secureRandom);
// 生成秘钥
Key key = keyGen.generateKey();
// testalias为别名,testalias123为其密码
keyStore.setKeyEntry("testalias", key, "testalias123".toCharArray(), null);
// testkeystore123密钥库密码
keyStore.store(new FileOutputStream("src/main/resources/secretkey/testkeystore.keystore"), "testkeystore123".toCharArray());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
三、发现
方法一中,即使每次生成文件时的命令保持一致,每次生成的key也都是不同的;方法二中,每次生成keystore文件的代码保持一致,特别是生成SecureRandom时的password保持一致,最终生成的key便可相同。