转一个加解密技术科普类文章。

转自:《皮克--Different-types-of-keystore-in-Java----Overview》

Keystore 是存储加密密钥和证书的存储工具。它们最常用于 SSL 通信,以证明服务器和客户端的身份。密钥库可以是文件或硬件设备。根据密钥库的类型,三种条目可以存储在密钥库中。

三种类型的条目是:

PrivateKey:这是一种用于非对称加密的密钥。由于它的敏感性,它通常用密码保护。它也可用于签署数字签名。

证书:证书包含一个公钥,可以识别证书中声明的主题。它通常用于验证服务器的身份。有时它也用于在请求时识别客户端。

SecretKey:在对称密码学中被起诉的密钥条目。

根据密钥库可以存储哪些条目以及密钥库如何存储条目,Java 中有几种不同类型的密钥库:JKS、JCEKS、PKCS12、PKCS11 和 DKS。您可以在Oracle 的 Java Cryptography Architecture描述中找到这些密钥库的介绍。

接下来,我们将对这些密钥库类型进行概述。

JKS,Java 密钥库。您可以在 sun.security.provider.JavaKeyStore 找到此文件。此密钥库是 Java 特定的,它通常具有 jks 的扩展名。这种类型的密钥库可以包含私钥和证书,但不能用于存储密钥。由于它是 Java 特定的密钥库,因此不能在其他编程语言中使用。存储在 JKS 中的私钥无法在 Java 中提取。

JCEKS,JCE 密钥库(Java Cryptography Extension KeyStore)。它是 JKS 的超级集,支持更多算法。它是 Sun 后来添加的增强标准。您可以在 com.sun.crypto.provider.JceKeyStore 找到此文件。此密钥库具有 jceks 的扩展。可以放入 JCEKS 密钥库的条目是私钥、密钥和证书。此密钥库通过使用三重 DES 加密为存储的私钥提供更强大的保护。

JCEKS 的提供者是 SunJCE,它是在 Java 1.4 中引入的。因此在 Java 1.4 之前,只能使用 JKS。

PKCS12,这是一种标准的密钥库类型,可用于 Java 和其他语言。您可以在 sun.security.pkcs12.PKCS12KeyStore 找到此密钥库实现。它通常具有 p12 或 pfx 的扩展名。您可以在此类型上存储私钥、密钥和证书。与 JKS 不同,PKCS12 密钥库上的私钥可以用 Java 提取。这种类型是可移植的,并且可以与用其他语言(例如 C、C++ 或 C#)编写的其他库一起操作。

目前Java 中默认的keystore 类型是JKS,即如果您在使用keytool 创建keystore 时没有指定-storetype,那么keystore 格式将为JKS。但是,Java 9 中的默认密钥库类型将更改为 PKCS12,因为它与 JKS 相比具有增强的兼容性。您可以在$JRE/lib/security/java.security文件中检查默认密钥库类型:

PKCS11,这是一种硬件密钥库类型。它为 Java 库提供了一个接口,用于连接硬件密钥库设备,例如 SafeNet 的 Luna、nCipher 或智能卡。你可以在 sun.security.pkcs11.P11KeyStore 找到这个实现。加载密钥库时,您无需创建具有特定配置的特定提供程序。该密钥库可以存储私钥、密钥和证书。加载密钥库时,将从密钥库中检索条目,然后将其转换为软件条目。

DKS , Domain KeyStore 是keystore的keystore。它抽象出一组作为单个逻辑密钥库呈现的密钥库。它本身实际上不是密钥库。Java 8中引入了这种新的密钥库类型。有一个与 DKS 密切相关的新类DomainLoadStoreParameter 。

此密钥库位于sun.security.provider.DomainKeyStore.java。

Windows-MY,这是 Windows 上的一种密钥库,由 Windows 操作系统管理。它存储用户私钥和证书,可用于执行加密操作,如签名验证、数据加密等。由于它是一种本地密钥库,Java 没有通用的 API 来访问它。Oracle 提供了一个单独的 API 来访问 Windows-MY 密钥库——SunMSCAPI。此 API 的提供程序类是 sun.security.mscapi.SunMSCAPI。

BKS,BoucyCastle 密钥库,是流行的第三方 Java 加密库提供程序 - BouncyCastle提供的密钥库格式。它是一个类似于 Oracle JDK 提供的JKS的密钥库。但它支持存储密钥、私钥和证书。它经常用于移动应用程序开发。

在 Java 中,有几个关于如何处理密钥库的选择。编写 Java 代码显然是一种选择。除此之外,还可以使用JDK自带的一个工具,叫做keytool。

keytool 是一个命令行工具。它可用于创建密钥库、生成密钥、导入和导出证书等。有关 keytool 支持的命令的完整列表,您可以参考Oracle keytool 指南。