【AES对称加密及 KeyStore 存放秘钥】

AES对称加密 及 KeyStore 数据存储与读取

  • AES 对称加解密
  • KEYSTORE 存储读取信息
  • KEYSTORE 存储读取秘钥信息
  • 相关导入

AES 对称加解密

/**
     * AES 对称加密、解密测试
     */
    public static void aesTest() {
        String plainText = "TCBJ-SECRET-KEY-ENCODE-DECODE-TEST";
        try {
            // 生成秘钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            SecretKey secretKey =  keyGenerator.generateKey();

            /**
             * todo
             * 根据业务保存秘钥,秘钥一旦变化旧的内容无法解密
             */

            // 加密
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encrypted = cipher.doFinal(plainText.getBytes());

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decrypted = cipher.doFinal(encrypted);

            System.out.println("输入:" + plainText);
            System.out.println("加密结果:" + new String(encrypted));
            System.out.println(decrypted);
            System.out.println("解密结果:" + new String(decrypted));

        } catch (Exception e) {
            System.out.println("AES 加解密异常");
        }
    }

KEYSTORE 存储读取信息

此处的keystore文件是用命令生成的,密码在命令中就定义了
不想用命令生成也可以在代码中直接生成
具体执行路径:JDK安装目录的 /bin 下 打开cmd 窗口
jceks 记得写对

keytool -genkey -alias csdn -keypass 123456 -keyalg RSA -keysize 1024 -validity 3650 -keystore D:/keyStore/test.keystore -storepass 888999 -storetype jceks

存储普通数据

/**
     * keystore 文件秘钥存储测试
     */
    public static void keyStoreTest() {
        FileInputStream inputStream = null ;
        OutputStream outputStream = null;
        try {
            // 读取 keyStore 文件转换为 keyStore 密钥库对象
            inputStream = new FileInputStream("D:\\keyStore\\test.keystore");
            // 设置证书类型 jceks
            KeyStore keyStore = KeyStore.getInstance("jceks");
            // 设置密钥库密码——获取keystore信息所需的密码
            String storepass = "888999";
            keyStore.load(inputStream,storepass.toCharArray());
            inputStream.close();


            // 加载keystore,就可以读取keystore现有条目、或者写入新条目
            // 别名——创建文件指定好的别名及密码
            String alias = "csdn";
            // 别名密码,指定别名条目的密码——私钥密码
            String keypass = "123456";
            KeyStore.ProtectionParameter parameter = new KeyStore.PasswordProtection(keypass.toCharArray());
            KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias,parameter);
            PrivateKey myPrivateKey = entry.getPrivateKey();
            System.out.println("获取到的私钥是:" + myPrivateKey.toString());

            // 设置秘钥信息别名 desPws 及 访问密码 decrp pws ,写入存储信息 desPwd
            String desPwd = "我是存储在 keystore 中的 AES 加密解密用的秘钥4.0";
            String password = "decryp pws";
            SecretKey mySecretKey = new SecretKeySpec(desPwd.getBytes(),"JKS");
            KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey);
            keyStore.setEntry("desPws", skEntry, new KeyStore.PasswordProtection(password.toCharArray()));
            // 将 keystore 存储到指定输出流,并用密码保护完整性
            outputStream = new FileOutputStream("D:\\keyStore\\test.keystore");
            keyStore.store(outputStream,storepass.toCharArray());
            outputStream.close();
        } catch (Exception e) {
            // todo 存储 keyStore 文件失败
        } finally {
            try {
                if (outputStream !=  null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                // todo 关闭文件流失败
            }
        }
    }

读取普通数据

/**
     * keystore 文件秘钥提取测试
     */
    public static void keyStoreDecodeTest() {
        String storepass = "888999";
        try {
            FileInputStream inputStream = null;
            // 读取keystore文件转换为 keystore 密钥库对象
            inputStream = new FileInputStream("D:\\keyStore\\test.keystore");
            // 设置证书类型
            KeyStore keyStore = KeyStore.getInstance("jceks");
            // 使用密钥库密码访问
            keyStore.load(inputStream,storepass.toCharArray());
            inputStream.close();

            // 根据别名,从 证书获取密码并解密
            // keystore.getKey 返回与给定别名关联的秘钥,并用给定密码来恢复他
            String password = "decryp pws";
            Key key = keyStore.getKey("desPws",password.toCharArray());
            // key.getEncode 返回基本编码格式的秘钥,如果秘钥不支持编码,返回null
            // 注意这里存储的是字符串,所以要根据 encode 转化,如果存储的是 SecretKey 直接 key 的值就是了
            System.out.println("从证书中获取的秘钥为:" + new String(key.getEncoded()));
        } catch (Exception e) {
            // todo 异常处理
        }
    }

KEYSTORE 存储读取秘钥信息

这里跟存储、读取普通数据其实差不多,多了一个生成 keystore 文件步骤而已
读取的时候 key 直接就是对应存储的 secretKey了

    /**
     * AES 秘钥对象 SecretKey 存储 KeyStore 中
     */
    public static void saveSecretKey2KeyStore() {
        try {
            // 生成秘钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            SecretKey secretKey =  keyGenerator.generateKey();
            KeyStore keyStore = KeyStore.getInstance("jceks");
            keyStore.load(null,null);
            System.out.println("保存的秘钥:" + secretKey);
            // 可以存字符串也可以存对象
            KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
            // 设置条目名称及密码
            String entryPwd = "abc";
            keyStore.setEntry("test",secretKeyEntry,new KeyStore.PasswordProtection(entryPwd.toCharArray()));
            FileOutputStream outputStream = new FileOutputStream("D:\\keyStore\\test2.keystore");
            // 设置文件访问密码
            String storepwd = "123456";
            keyStore.store(outputStream,storepwd.toCharArray());
            outputStream.close();
        } catch (Exception e) {
            // todo
        }
    }
   /**
     * 从 KeyStore 获取 AES 秘钥对象 SecretKey
     */
    public static void getSecretKeyFromKeyStore() {
        try {
            String storepass = "123456";
            FileInputStream inputStream = new FileInputStream("D:\\keyStore\\test2.keystore");
            KeyStore keyStore1 = KeyStore.getInstance("jceks");
            keyStore1.load(inputStream,storepass.toCharArray());
            inputStream.close();
            String password = "abc";
            Key key = keyStore1.getKey("test",password.toCharArray());
            SecretKey keyValue = (SecretKey) key;
            System.out.println("获取到的秘钥:" + keyValue);
        } catch (Exception e) {
            // todo
        }
    }

相关导入

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/38170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML <map> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

Spring Boot 中的 @Field 注解详解

Spring Boot 中的 Field 注解详解 引言 Spring Boot 是目前 Java 生态圈中最受欢迎的 Web 应用开发框架之一&#xff0c;它提供了很多优秀的功能和工具&#xff0c;可以帮助开发者快速构建高效、可靠的 Web 应用程序。其中一个重要的功能就是数据绑定和验证&#xff0c;Sprin…

(阿里云)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到阿里云物联网平台

1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内&#xff08;注意不要弄错方向&#xff09; 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接…

DP485替代MAX485 RS485/RS422 收发器芯片

DP485E 是一款 5V 供电、半双工、低功耗、低摆率&#xff0c;完全满足 TIA/EIA-485 标准要求的 RS-485收发器。DP485E 工作电压范围为 4.75~5.25V&#xff0c;具备失效安全&#xff08;fail-safe&#xff09;、过温保护、限流保护、过压保护&#xff0c;控制端口热插拔输入等功…

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学&#xff1a;飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

数据科学分析全流程步骤

知识图谱以结构化的“知识”来存储与表示海量数据&#xff0c;作为承载底层海量知识并支持上层智能应用的重要载体&#xff0c;它在智能时代中扮演了极其重要的角色。然而&#xff0c;由于知识图谱高度结构化的特点&#xff0c;我们常常需要构建结构化查询语句&#xff08;SPAR…

使用 jmeter 进行审批类接口并发测试

目录 前言&#xff1a; 背景&#xff1a; 难点&#xff1a; 场景 a&#xff1a; 场景 b&#xff1a; 前言&#xff1a; 使用JMeter进行审批类接口的并发测试是一种有效的方法&#xff0c;可以模拟多个用户同时对接口进行审批操作&#xff0c;以评估系统在高负载情况下的性…

LLM - DataCollatorForLanguageModeling 样本生成 by transformers

目录 一.引言 二.生成样本 By API 1.样本处理样式 2.DataCollatorForLanguageModeling 2.1 样本准备 2.2 API 生成 三.生成样本 By DIY 1.样本准备 2.data_colloator 实现 3.使用自定义 data_colloator 四.总结 一.引言 前面我们讲了 Baichuan7B 的 lora 微调步骤&a…

Qt添加第三方字体

最近开发项目时&#xff0c;据说不能用系统自带的微软雅黑字体&#xff0c;于是找一个开源的字体&#xff0c;思源黑体&#xff0c;这个是google和Adobe公司合力开发的可以免费使用。本篇记录一下Qt使用第三方字体的方式。字体从下载之家下载http://www.downza.cn/soft/266042.…

uniapp实现路由跳转拦截

场景&#xff1a;系统可以不登录就可以访问浏览商城&#xff0c;一些菜单&#xff08;购买、添加修改用户信息、添加地址、修改密码等&#xff09;需要进行登录才能操作。 思路&#xff1a; 1.新建公共js文件进行路由拦截&#xff0c;添加白名单。&#xff08;白名单菜单不需…

【压力传感器】LPS22DFTR、LPS33KTR 绝对 压力,ADP5131 排气式压力计 50kPa 6-DIP

LPS22DFTR MEMS纳米压力传感器是一款超紧凑型压阻式绝对压力传感器&#xff0c;可用作数字输出气压计。LPS22DF的功耗更低&#xff0c;与上一代产品相比压力噪声更低。该器件包括一个传感元件和一个IC接口&#xff0c;通过I2C、MIPI I3CSM或SPI接口从传感元件向应用程序进行通信…

【操作系统】几种基本页面置换算法的基本思想和流程图

目录 一、概述二、最佳置换算法&#xff08;OPT&#xff09;三、先进先出置换算法&#xff08;FIFO&#xff09;四、最近最久未使用置换算法&#xff08;LRU&#xff09;五、三种页面置换算法优缺点对比六、运行结果七、总结 一、概述 在地址映射过程中&#xff0c;若在页面中发…

在After Effects 加速渲染的 21个技巧,记得收藏!

如何减少After Effects 渲染时间&#xff1f; 1.升级内存 减少渲染时间的一种有效方法是升级 RAM&#xff08;随机存取存储器&#xff09;。RAM 在渲染过程中起着至关重要的作用&#xff0c;因为它存储并快速访问渲染任务所需的数据。增加系统中的 RAM 量可提供更多的数据存储…

Activity引擎(初次学习与总结梳理全记录,包括易混淆知识点分析,常用报错解决方案等)

最近工作需要使用Acticity框架处理审批业务&#xff0c;简单了解后能虽能很快的上手&#xff0c;但是对于Activity的整体认识并不够&#xff0c;特此花费很多精力全面的学习并记录。包含对很多的概念的第一次理解过程&#xff1b;对知识点的混淆地方的梳理&#xff1b;对实践过…

深度学习 / 数据处理:如何处理偏态数据

1 前言 当我们使用一个线性回归模型时&#xff0c;通常这个模型是在很大假设的前提下才有一个很好的结果&#xff1a; 1、假设预测因子和预测目标之间的关系是线性的2、数据不存在外在噪声&#xff1a;不存在一些极端的数据3、非共线性&#xff08; collinearity&#xff09;…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

Windows Bat实现延时功能的几种常见方式

文章目录 1. 使用ping命令实现延时2. 使用timeout命令实现延时3. 使用choice命令实现延时4. 使用for循环实现延时5. 使用sleep命令实现延时6. 使用VBScript.sleep实现延时总结 在 bat批处理中实现延时功能的几种常用方式 1. 使用ping命令实现延时 使用ping命令可以实现延时的…

最小二乘拟合平面——拉格朗日乘子法

目录 一、算法原理二、代码实现1、python2、matlab 三、算法效果 一、算法原理 设拟合出的平面方程为&#xff1a; a x b y c z d 0 (1) axbyczd0\tag{1} axbyczd0(1) 约束条件为&#xff1a; a 2 b 2 c 2 1 (2) a^2b^2c^21\tag{2} a2b2c21(2)   可以得到平面参数 a…

ahk1.1获取输入光标当前位置坐标(不是鼠标的位置)

F1 Up::Caret:GetCaretPos(1), hasCaretPos:1x坐标 : Caret.xy坐标 : Caret.yToolTip, %x坐标% %y坐标%Return; 获取光标坐标GetCaretPos(Byacc:1){Static initIf (A_CaretX""){Caretx:Carety:CaretH:CaretW:0If (Byacc){If (!init)init:DllCall("LoadLibrary&q…
最新文章