Keytool 操作 keystore存AES256 key

本文详细介绍AES256加密技术的应用实践,包括生成及管理密钥、使用Java实现加密与解密的具体步骤,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于近期的要写一个对称加密的module,遇到一些问题,在此做个笔记

AES 256原生Java jdk not support it. 需要替换掉其中的lib 下secret 里的两个将jar,此处百度十分好找,自行查找。

1.生成keyStore 文件,由于使用的是AES256位的key,使用jce提供的 jceks 文件格式。

keytool -genseckey -keystore c:\UserKeyStore.jceks -storetype jceks -storepass AESCrypto  -keyalg AES -keysize 256 -alias jceksaes

会提示别称jecksaes的key的密码是否和keystore的密码是否一致。为了安全考虑,keystore的访问是需要密码的,key的访问也需要密码,因为一个keystore可能存储多个key,每个key的存储格式为 entry  类似。

 c:\UserKeyStore.jceks  生成在c盘根目录下。

AESCrypto                     -storepass此处是访问keystore的密码

jceksaes                         -alias 参数后跟的是生成的key的别称


2.查了很多文档都没有详细说明当使用 keytool 工具修改keystore密码的command,多数都会报错。因为格式是jce的,所以有些问题。

keytool -storetype jceks -storepasswd -new 123456 -keystore c:\UserKeyStore.jceks -storepass AESCrypto

修改keystore 的密码从AESCrypto 换成 123456 ,多次报错的原因是因为storetype jceks没有带上,导致keytool工具认生。


3.使用keytool工具修改key 的password.

keytool -storetype jceks -keypasswd -alias jceksaes -new 654321 -keypass AESCrypto -keystore  c:\UserKeyStore.jceks  -storepass 123456


4.keytool read keystore ,同样加上参数-storetype jceks 后加上

package com.alions;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AES256{ 

	  public static boolean initialized = false;  
      
	  public static final String ALGORITHM = "AES/ECB/PKCS7Padding";  
	      
	    /** 
	     * @param  String str  要被加密的字符串 
	     * @param  byte[] key  加/解密要用的长度为32的字节数组(256位)密钥 
	     * @return byte[]  加密后的字节数组 
	     */  
	    public static String  Aes256Encode(String str, byte[] key){  
	        initialize();  
	        byte[] result = null; 
	        String encoded=null;
	        try{  
	        	
	            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
	            SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
	            cipher.init(Cipher.ENCRYPT_MODE, keySpec);  
	            result = cipher.doFinal(str.getBytes("UTF-8"));
	            
	            BASE64Encoder encoder = new BASE64Encoder();
	    		encoded = encoder.encode(result);
	    		
	    		
	        }catch(Exception e){  
	            e.printStackTrace();  
	        }  
	        return encoded;  
	    }  
	      
	    /** 
	     * @param  byte[] bytes  要被解密的字节数组 
	     * @param  byte[] key    加/解密要用的长度为32的字节数组(256位)密钥 
	     * @return String  解密后的字符串 
	     */  
	    public static String Aes256Decode(String  encryptionStr, byte[] key){  
	        initialize();  
	        String result = null;  
	        try{  
	            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
	            SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
	            cipher.init(Cipher.DECRYPT_MODE, keySpec);  
	            
	            BASE64Decoder decoder = new BASE64Decoder();
	    		byte[] bytes = decoder.decodeBuffer(encryptionStr);
	            
	            byte[] decoded = cipher.doFinal(bytes);  
	           
	            
	            result = new String(decoded, "UTF-8");  
	        }catch(Exception e){  
	            e.printStackTrace();  
	        }  
	        return result;  
	    }  
	      
	    public static void initialize(){  
	        if (initialized) return;  
	        Security.addProvider(new BouncyCastleProvider());  
	        initialized = true;  
	    } 
	    
	
	    /***\
	     * 存储当前的key
	     */
	    private String pwd="AESCrypto";
	    @Test
	    public void saveUserKey(){
	    	try{
	    		File keyStorefile =new File("./UserKeyStore.jceks");
	    		
		    	KeyStore keyStore = KeyStore.getInstance("JCEKS");
		    	//create a new  the  paremete is null , pwd is null
				if(AES256.isFileExists(keyStorefile)){
					keyStore.load(new FileInputStream(keyStorefile), pwd.toCharArray());  			
				}else{
					//新建
					keyStore.load(null, null);
				}
		    	KeyGenerator keyGen = KeyGenerator.getInstance("AES");
		    	String password="admin";
		    	
		        keyGen.init(256,new SecureRandom(password.getBytes()));
		        
		        Key key=keyGen.generateKey();
		        byte[] enCodeFormat = key.getEncoded();
		        System.out.println(enCodeFormat.length);
//Ss/jICpf9c9GeJj8WKqx1hUClEEELCSL9GF/s23xx5M=
		        String strTempKey=Base64.getEncoder().encodeToString(enCodeFormat);
		        
		        System.out.println(strTempKey);
		        System.out.println(strTempKey.length());
		        keyStore.setKeyEntry("TMOKey", key, "AESCrypto".toCharArray(), null);
		        keyStore.store(new FileOutputStream(keyStorefile), pwd.toCharArray());	
	    	}catch (Exception ex) {
	    	    ex.printStackTrace();
	    	}
	    }
	    
	    /**
	     * get the key from the key store
	     * keytool -genseckey -keystore UserKeyStore.jceks -storetype jceks -storepass AESCrypto -keyalg AES -keysize 256 -alias jceksaes 
	     * 
	     * AESCrypto keystore的存储密钥
	     * 
	     */
	    @Test
	    public void getKeyFromKeyStore(){
	    	try{
	    		File keyStorefile =new File("./UserKeyStore.jceks");
	    		
				KeyStore keyStore = KeyStore.getInstance("JCEKS");
				if(AES256.isFileExists(keyStorefile)){
					keyStore.load(new FileInputStream(keyStorefile),"AESCrypto".toCharArray());
				}else{
					throw new Exception("No UserKeyStore.JCEKS exists");
				}
				//Mb25QS0ytWTjzybaBgk4kNx8fzw/ClxsAIyYQJBBFSQ=
				Key key = keyStore.getKey("jceksaes", "AESCrypto".toCharArray());
				byte[] enCodeFormat = key.getEncoded();
				System.out.println(enCodeFormat.length);
		        String strTempKey=Base64.getEncoder().encodeToString(enCodeFormat);
				System.out.println(strTempKey.toString());
				
	    	}catch(Exception ex){
	    	    ex.printStackTrace();
	    	}
	    }
	    
	 // 判断文件夹是否存在
	    public static void judeDirExists(File file) {

	        if (file.exists()) {
	            if (file.isDirectory()) {
	                System.out.println("dir exists");
	            } else {
	                System.out.println("the same name file exists, can not create dir");
	            }
	        } else {
	            System.out.println("dir not exists, create it ...");
	            file.mkdir();
	        }

	    }

	    // 判断文件是否存在
	    public static boolean isFileExists(File file) {

	        if (file.exists()) {
	            System.out.println("file exists");
	            return true;
	        } else {
	            System.out.println("file not exists, create it ...");
	            return false;
	        }

	    }
	    
	    
//	    public static void main(String agrs[]){
//	    	byte[] keys={33, 34, 35, 36, 37, 38, 39, 40, 4, 42, 43, 44, 45, 46, 47, 58, 59, 60, 6, 62, 63, 64, 9, 92, 93, 94, 95, 96, 23, 24, 25, 26};
//	    	String str="i love  dsgfsdsf life";
//	    	String resultBytes=AES256.Aes256Encode(str, keys);
//	    	System.out.println("this is the clear text:" +str);
//	    	System.out.print("this is after encryption word: ");
//	    	//print the resultKey array
//	    	System.out.println(resultBytes);
//	    	
//	    	System.out.print("this is the word after decryption :");
//	    	String decryptionStr=AES256.Aes256Decode(resultBytes, keys);
//	    	System.out.println(decryptionStr);	    	
//	    	
//	    }
}
        

-list 以及其他参数即可读取


附上一段java代码,本人测试使用





        

<think>首先,用户的问题是:“请问如何安装用于加密文件的keytool工具”。用户想了解如何安装Java keytool工具,用于加密文件。 根据系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的站内引用,但用户的问题是关于安装keytool,而不是直接引用内容。 提供的引用是关于keytool工具的描述,但用户的问题是关于安装的。引用中提到: - 引用[2]: Keytool是Java自带的工具,安装Java即可。位于Java安装的bin目录中。 - 其他引用描述了keytool的功能,但没有直接提供安装步骤。 所以,我需要基于这些信息构建回答。keytool是Java Development Kit (JDK)的一部分,安装JDK就会安装keytool。 步骤: 1. **确认需求**:用户想安装keytool用于加密文件。keytool用于管理密钥和证书,可以用于加密相关操作。 2. **安装Java**:keytool随JDK一起安装。因此,安装JDK是关键。 3. **提供清晰步骤**:结构清晰,逐步解决问题。 4. **生成相关问题**:在最后添加相关问题。 回答结构: - **引言**:简要解释keytool是什么以及为什么需要安装Java。 - **步骤**:详细步骤如何安装JDK(包括keytool)。 - 下载JDK。 - 安装JDK。 - 验证安装。 - **验证keytool**:如何检查keytool是否安装成功。 - **加密文件提示**:简要提到keytool如何用于加密文件(例如,创建密钥库)。 - **相关问题**:生成相关问题。 使用中文回答。 生成相关问题:基于主题,如keytool的使用、加密方法等。 引用标识:在回答中,如果引用提供的引用内容,需要添加引用标识。例如: - 引用[2]提到keytool是Java自带的工具,安装Java即可。 - 其他引用描述功能。 所以,在回答中自然地添加引用。 最终回答: - 开头:解释keytool和安装前提。 - 步骤:下载和安装JDK。 - 验证:检查keytool- 结尾:相关问题。 相关问题建议: 1. 如何使用keytool创建密钥库? 2. keytool支持哪些加密算法? 3. 如何用keytool加密文件? 4. keytool的常见错误和解决方法? 等等。</think>### 如何安装Java keytool工具用于加密文件 Java keytool工具是Java Development Kit (JDK)的一部分,用于管理密钥和证书,支持创建密钥库、生成密钥对等操作,这些功能可用于文件加密(如通过SSL/TLS实现安全传输)[^2]。keytool本身不是独立安装的程序;它随JDK一起提供。因此,安装keytool的关键是安装JDK。下面我将以清晰步骤指导您完成安装过程,确保环境设置正确。 #### 步骤1: 下载并安装JDK keytool作为Java的标准工具,安装JDK后会自动包含在系统路径中[^2]。以下是详细步骤: - **下载JDK**: - 访问Oracle官网的[JDK下载页面](https://www.oracle.com/java/technologies/downloads/)。 - 选择适合您操作系统的版本(如Windows、Linux或macOS)。推荐下载最新LTS版本(如JDK 17或21),因为它包含最新的安全更新。 - 下载安装包(例如,Windows用户选择.exe文件,Linux用户选择.tar.gz或.deb文件)。 - **安装JDK**: - **Windows系统**:双击下载的.exe文件,按照向导安装。默认路径通常是`C:\Program Files\Java\jdk-<version>`。安装过程中,确保勾选“Add to PATH”选项,以便在命令行中直接使用keytool- **Linux系统**:使用终端命令安装。例如,对于Ubuntu/Debian: ```bash sudo apt update sudo apt install openjdk-17-jdk # 替换版本号如17为所需版本 ``` - **macOS系统**:双击下载的.dmg文件,或使用Homebrew命令: ```bash brew install openjdk@17 # 替换版本号 ``` 安装完成后,JDK会自动将keytool添加到系统路径中[^2]。 #### 步骤2: 验证JDK和keytool安装 安装后,需要检查JDK和keytool是否可用: - **检查JDK版本**:打开命令行终端(Windows的CMD或PowerShell,Linux/macOS的Terminal),输入: ```bash java -version ``` 如果输出类似`java version "17.0.1"`的信息,说明JDK安装成功。 - **验证keytool**:在同一个终端中,输入: ```bash keytool -help ``` 如果显示keytool的帮助菜单(包括命令选项如`-genkeypair`用于生成密钥),则表示keytool已正确安装[^2][^4]。keytool通常位于JDK的`bin`目录下(例如Windows的`C:\Program Files\Java\jdk-17\bin\keytool.exe`)。 #### 步骤3: 使用keytool进行文件加密(简要指南) keytool本身不直接加密文件内容,但它可以创建密钥库和证书,用于加密过程(如通过Java程序实现文件加密)。基本流程: - **创建密钥库**:使用keytool生成密钥对,例如: ```bash keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.jks ``` 这会生成一个受密码保护的密钥库文件`mykeystore.jks`,其中RSA算法用于非对称加密[^3][^5]。 - **加密文件**:在Java程序中,使用此密钥库加载密钥,结合JCE(Java Cryptography Extension)实现文件加密。例如,使用`Cipher`类进行AES加密[^3]。 引用[3]提到:"keytool生成的公钥/私钥对放到一个文件中,通称为keystore,用于非对称加密"[^3]。 #### 常见问题解决 - **问题:keytool命令未找到**:这通常是因为PATH环境变量未设置。手动添加JDK的bin目录到PATH: - Windows:在系统环境变量中添加`C:\Program Files\Java\jdk-17\bin`。 - Linux/macOS:在`~/.bashrc`或`~/.zshrc`中添加`export PATH=$PATH:/usr/lib/jvm/jdk-17/bin`。 - **加密文件提示**:keytool主要用于密钥管理,实际文件加密需要结合Java API。推荐参考Oracle的[Java加密文档](https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html)。 通过以上步骤,您即可成功安装并使用keytool工具进行加密相关操作keytool是Java安全生态的核心工具,安装JDK后即可免费使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值