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. 01-module/分频器/激励写法

    1.module module有出入接口,输出接口 module有时钟和复位 // input clock; rest_n; // n表示低电平复位 //output o_data; module m ...

  2. 基于AHB_BUS的eflash控制器设计-02

    基于AHB-BUS的eflash控制器设计 1.Flash Spec 1.1 地址映射 XADR是10bit?因为一共有1024行 每一行128byte容量,每次读取的粒度就是一个double wor ...

  3. JMS微服务开发示例(三)使用分布式锁和编写定时任务

    分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...

  4. Git-签名-user-email

  5. [转帖]如何理解 kernel.pid_max & kernel.threads-max & vm.max_map_count

    https://www.cnblogs.com/apink/p/15728381.html 背景说明 运行环境信息,Kubernetes + docker .应用系统java程序 问题描述 首先从Ku ...

  6. [转帖]Prometheus Shell Exporter

    Shell Exporter can execute Powershell or Bash scripts and transform its output to Prometheus metrics ...

  7. Oracle Preinstall 调优参数的学习

    Oracle Preinstall 调优参数的学习 背景 学习是一个痛苦并快乐的过程. 之前自己手工安装过很多套Oracle数据库,也总结过很多 但是很多都是比较皮毛的. 最近遇到了一些问题. 才发现 ...

  8. TiKV占用内存超过的解决过程

    TiKV占用内存超过的解决过程 背景 为了后去TiDB的极限数据. 晚上在每台服务器上面增加了多个TiKV的节点. 主要方式为: 每个NVME的硬盘增加两个TiKV的进程. 这样每个服务器两个磁盘, ...

  9. [转帖]【SOP】最佳实践之 TiDB 业务写变慢分析

    https://zhuanlan.zhihu.com/p/647831844 前言 在日常业务使用或运维管理 TiDB 的过程中,每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题.这类问 ...

  10. [转帖]实战瓶颈定位-我的MySQL为什么压不上去

    https://plantegg.github.io/2023/06/20/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88% ...