KeyStore(译:密钥存储库) 代表用于加密密钥和证书的存储设施。

KeyStore 管理不同类型的 entry(译:条目)。每种类型的 entry 都实现了 KeyStore.Entry 接口。提供了三个基本的 KeyStore.Entry 实现:

  • KeyStore.PrivateKeyEntry

  • 这种类型的 Entry 持有一个加密PrivateKey,可以选择以受保护的格式存储,以防止未经授权的访问。它还伴随着对应的公钥的证书链。私钥和证书链由给定实体用于自我身份验证。这种身份验证的应用程序包括软件分发组织,它们将JAR文件作为发布和/或许可软件的一部分进行签名。

  • KeyStore.SecretKeyEntry

  • 这种类型的 Entry 持有一个加密的SecretKey,它可以选择以受保护的格式存储,以防止未经授权的访问。

  • KeyStore.TrustedCertificateEntry

  • 这种类型的Entry包含一个属于另一方的公钥证书。它被称为受信任的证书,因为密钥存储库所有者信任证书中的公钥确实属于证书的主体(所有者)标识的身份。这种类型的Entry可用于对其他方进行身份验证。

KeyStore 中的每个 Entry 都由一个“alias”字符串标识。对于私钥及其关联的证书链,这些字符串区分实体对自身进行身份验证的不同方式。例如,实体可以使用不同的证书颁发机构或使用不同的公钥算法对自己进行身份验证。

这里没有指定密钥存储库是否持久,以及密钥存储库使用的机制(如果它是持久的)。

请求KeyStore对象的典型方法包括依赖默认类型和提供特定的KeyStore类型:

  • 依赖默认类型:

  • KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  • 提供特定的密钥存储库类型:

  • KeyStore ks = KeyStore.getInstance("JKS");

在访问密钥存储库之前,必须先加载它。

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

// get user password and file input stream
char[] password = getPassword(); try (FileInputStream fis = new FileInputStream("keyStoreName")) {
ks.load(fis, password);
}

为了用上面的方法创建一个空的 KeyStore(密钥存储库),可以传递null作为InputStream参数。

一旦加载了密钥存储库,就可以从密钥存储库中读取现有条目,或者将新条目写入密钥存储库:

KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(password);

// get my private key
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("privateKeyAlias", protParam);
PrivateKey myPrivateKey = pkEntry.getPrivateKey(); // save my secret key
javax.crypto.SecretKey mySecretKey;
KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry("secretKeyAlias", skEntry, protParam); // store away the keystore
try (FileOutputStream fos = new FileOutputStream("newKeyStoreName")) {
ks.store(fos, password);
}

注意,尽管可以使用相同的密码加载keystore、保护private key entry、保护secret key entry和存储keystore(如上面的示例代码所示),但也可以使用不同的密码或其他保护参数。

更多请参见 java.security.KeyStore

下面,演示一下

首先,生成一个密钥文件

keytool -genkeypair -alias soas -keypass 123456 -keyalg RSA -storepass 123456 -keysize 1024 -validity 3650 -keystore F:/soas.jks

加载keystore

//  创建KeyStore
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
KeyStore ks2 = KeyStore.getInstance("JKS"); // 加载KeyStore
InputStream is = new ClassPathResource("keyStoreName").getInputStream();
ks.load(is, "storepass".toCharArray()); FileInputStream fis = new FileInputStream("keyStoreName");
ks.load(is, "storepass".toCharArray()); // 获取PrivateKey/PublicKey(方式一)
KeyStore.ProtectionParameter protectionParameter = new KeyStore.PasswordProtection("keypass".toCharArray());
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("alias", protectionParameter); PrivateKey myPrivateKey = privateKeyEntry.getPrivateKey();
PublicKey myPublicKey = privateKeyEntry.getCertificate().getPublicKey(); System.out.println(myPrivateKey);
System.out.println(myPublicKey); // 获取PrivateKey/PublicKey(方式二)
PrivateKey myPrivateKey2 = (PrivateKey) ks.getKey("alias", "keypass".toCharArray());
PublicKey myPublicKey2 = ks.getCertificate("alias").getPublicKey(); System.out.println(myPrivateKey2);
System.out.println(myPublicKey2);

补充:生成token

package com.soa.supervision.portal.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource; import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.List; /**
* @Author ChengJianSheng
* @Date 2022/5/14
*/
@Slf4j
public class RSAUtils { private static final Logger logger = LoggerFactory.getLogger(RSAUtils.class);
private static final String CLAIM = "user"; public static RSAPublicKey rsaPublicKey;
private static RSAPrivateKey rsaPrivateKey; static {
try {
// KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// keyPairGenerator.initialize(2048);
// KeyPair keyPair = keyPairGenerator.generateKeyPair();
// publicKey = (RSAPublicKey) keyPair.getPublic();
// privateKey = (RSAPrivateKey) keyPair.getPrivate(); KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream is = new ClassPathResource("soas.jks").getInputStream();
keyStore.load(is, "123456".toCharArray());
is.close();
PrivateKey privateKey = (PrivateKey) keyStore.getKey("soas", "123456".toCharArray());
PublicKey publicKey = keyStore.getCertificate("soas").getPublicKey(); rsaPrivateKey = (RSAPrivateKey) privateKey;
rsaPublicKey = (RSAPublicKey)publicKey; } catch (NoSuchAlgorithmException | KeyStoreException | IOException | CertificateException | UnrecoverableKeyException e) {
logger.error("生成密钥对失败!原因: {}", e.getMessage(), e);
}
} public static String createToken(String name, Integer userId, List authorities) {
Algorithm algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
String token = JWT.create()
.withClaim(CLAIM, name)
.withClaim("userId", userId)
.withClaim("authorities", authorities)
.sign(algorithm);
return token;
} public static Claim parseToken(String token) {
Algorithm algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim(CLAIM);
}
}

从 KeyStore 中获取 PublicKey 和 PrivateKey的更多相关文章

  1. 从PFX文件中获取私钥、公钥证书、公钥

    https://blog.csdn.net/ZuoYanYouYan/article/details/77868584 该类具体功能:根据pfx证书得到私钥.根据私钥字节数组获取私钥对象.根据公钥字节 ...

  2. Android Studio中获取SHA1或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  3. Android Studio中获取查看签名SHA1证书指纹数据或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  4. Android Studio apk打包,keystore.jks文件生成,根据keystore密钥获取SHA1安全码

    keystore.jks文件生成,打包APK 选择Build > Generate Signed APK 出现如下弹框: 然后点击Create new...(创建的意思)出现另一个弹框,在做如下 ...

  5. Android Eclipse keystore.jks文件生成,根据keystore密钥获取SHA1安全码 ,apk打包

    keystore.jks文件生成,打包APK 选中项目右键-> Android Tools->Export Signed Application Package ,如图: 之后 点击Nex ...

  6. nodejs中获取时间戳、时间差

    Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...

  7. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

  8. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  9. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5  从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...

随机推荐

  1. Angular系列教程之变更检测与性能优化

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. [转帖]记一次探索内存cache优化之旅

    https://developer.aliyun.com/article/972803 背景 项目上线以来,曾出现上传镜像.下发镜像时可用内存不足,性能发生抖动的情况.研究发现是容器的 page ca ...

  3. [转帖]Linux字符截取命令-cut

    概述 cut是一个选取命令,.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. 语法 cut [-bn] [file] 1 或 cut [-c] [file] ...

  4. 阿里的AIGC数据库工具: Chat2DB的学习与使用

    阿里的AIGC数据库工具: Chat2DB的学习与使用 背景 今天陪家中老人去完医院后, 继续回来学习时发现 阿里巴巴的 chat2DB已经发布的 2.0.1的版本. 想着下载下来试试. 主要也是备忘 ...

  5. Oracle的awr的学习与整理

    Oracle的awr的学习与整理 背景 本来想上周末进行一下总结和汇总 因为周末两天进行了一次长时间的培训.所以没有成行. 只能在工作之余找时间进行总结. 数据库部分自己一个不是很强. 其实也比较抗拒 ...

  6. [转帖]Native Memory Tracking 详解(4):使用 NMT 协助排查内存问题案例

    https://www.modb.pro/db/557714 从前面几篇文章,我们了解了 NMT 的基础知识以及 NMT 追踪区域分析的相关内容,本篇文章将为大家介绍一下使用 NMT 协助排查内存问题 ...

  7. [转帖]关于iostat的问题,svctm数据不可信

    使用FIO对磁盘进行压力测试,使用1个线程对磁盘进行随机读,设置单次read的数据块分别为128KB和1M,数据如下: (1)单次IO数据块为128KB (2)单次IO数据块为1M 从上面的数据可以看 ...

  8. 【原创】关于xenomai3 RTnet的一点记录

    xenomai3协议栈RTnet支持TCP.UDP,但不支持IGMP: 对ARP支持有限制:地址解析的延迟会影响数据包传输延迟,RTnet为实时性考虑,路由表设计静态的,只在设置期间配置,或者接收到其 ...

  9. widows 安装docker

    1.安装docker 依次安装如下两个文件: 如启动docker报错:可以是hv没有开启,按如下方法解决 (23条消息) Windows10启动Docker报错:Hardware assisted v ...

  10. kettle系统列文章01---安装与配置

    1).到官网下载需要安装的kettle版本,目前最新版本4.2,官网地址:http://kettle.pentaho.org,我们是使用的版本是kettle3.2 2).本地安装jdk 1.4或以上版 ...