129

通过查看java.securitymy的文件JRE,我看到默认使用的密钥库类型设置为JKS. 在这里,有一个可以使用的密钥库类型的列表。

有推荐的密钥库类型吗?不同密钥库类型的优缺点是什么?

4

4 回答 4

162

除了您链接到的标准名称列表中列出的类型之外,还有更多类型。您可以在密码提供程序文档中找到更多信息。最常见的当然是JKS(默认)和PKCS12(对于 PKCS#12 文件,通常带有扩展名.p12或有时带有.pfx)。

如果您留在 Java 世界中,JKS 是最常见的。PKCS#12 不是 Java 特定的,使用从浏览器备份的证书(带有私钥)或来自基于 OpenSSL 的工具(keytool在 Java 6 之前无法转换密钥库和导入其私钥)特别方便,所以你必须使用其他工具)。

如果您已经有一个 PKCS#12 文件,直接使用该PKCS12类型通常更容易。可以转换格式,但如果您可以直接选择密钥库类型,则很少需要。

在 Java 7 中,PKCS12主要用作密钥库,但较少用于信任库(请参阅密钥库和信任库之间的区别),因为没有私钥就无法存储证书条目。相反,JKS不要求每个条目都是私钥条目,因此您可以拥有仅包含证书的条目,这对于存储您信任的证书列表的信任存储很有用(但您没有他们的私钥)。

这在 Java 8 中发生了变化,因此您现在也可以在PKCS12商店中拥有仅限证书的条目。(有关这些更改和进一步计划的更多详细信息,请参阅JEP 229:默认创建 PKCS12 密钥库。)

还有一些其他的密钥库类型,可能不太常用(取决于上下文),包括:

  • PKCS11,对于 PKCS#11 库,通常用于访问硬件加密令牌,但 Sun 提供程序实现也通过此支持 NSS 存储(来自 Mozilla)。
  • BKS,使用 BouncyCastle 提供程序(通常用于 Android)。
  • Windows-MY/ Windows-ROOT,如果您想直接访问 Windows 证书存储。
  • KeychainStore, 如果你想直接使用 OSX 钥匙串。
于 2012-07-18T11:15:55.770 回答
26

这是一篇介绍 Java 中不同类型的 keystore 以及不同类型的 keystore 之间的差异的帖子。http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----概览

以下是帖子中不同密钥库的描述:

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

JCEKS,JCE 密钥库。您可以在 com.sun.crypto.provider.JceKeyStore 找到此文件。此密钥库具有 jceks 的扩展。可以放入 JCEKS 密钥库的条目是私钥、密钥和证书。

PKCS12,这是一种标准的密钥库类型,可用于 Java 和其他语言。您可以在 sun.security.pkcs12.PKCS12KeyStore 找到此密钥库实现。它通常具有 p12 或 pfx 的扩展名。您可以在此类型上存储私钥、密钥和证书。

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

于 2014-08-21T09:27:12.567 回答
14

如果您使用的是 Java 8 或更新版本,您绝对应该选择Java 9 ( JEP 229PKCS12 )以来的默认值。

JKS与和相比的优点JCEKS是:

  • 可以存储密钥、私钥和证书
  • PKCS12是一种标准格式,可以被其他程序和库读取1
  • 提高安全性:JKS并且JCEKS非常不安全。从这些密钥库类型的暴力破解密码工具的数量可以看出这一点,在 Android 开发人员中尤其流行。2、3

1JDK-8202837,已在 Java 11 中修复

2所有密钥库类型(包括 PKCS12)使用的 PBE 的迭代次数过去相当弱(CVE-2017-10356),但是这已在 9.0.1、8u151、7u161 和 6u171 中得到修复

3进一步阅读:

于 2019-10-20T14:55:06.913 回答
4

Java 11 提供了以下类型的KeyStores:

jceks:SunJCE 提供者提供的专有密钥库实现。

jks:由 SUN 提供者提供的专有密钥库实现。

dks:域密钥库是作为单个逻辑密钥库呈现的密钥库的集合。它由配置数据指定,其语法在 DomainLoadStoreParameter 类中描述。

pkcs11:由 PKCS #11 令牌支持的密钥库。

pkcs12:PKCS #12 中定义的个人身份信息的传输语法。

来源:https ://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#keystore-types

于 2021-03-19T14:38:50.407 回答