Java密钥库

时间:2020-01-09 10:35:54  来源:igfitidea点击:

Java KeyStore是一个可以包含密钥的数据库。 Java KeyStore由KeyStore(java.security.KeyStore)类表示。可以将" KeyStore"写入磁盘并再次读取。整体上,可以使用密码保护"密钥库",并且可以使用自己的密码来保护"密钥库"中的每个密钥条目。这使KeyStore类成为一种安全处理加密密钥的有用机制。

" KeyStore"可以保存以下类型的密钥:

  • 私钥
  • 公钥+证书
  • 秘钥

私钥和公钥用于非对称加密。公钥可以具有关联的证书。证书是证明声称拥有公钥的个人,组织或者设备的身份的文档。证书通常由验证方进行数字签名以作为证明。

秘密密钥用于对称加密。在许多情况下,建立安全连接后会协商对称密钥。因此,与秘密密钥相比,我们将更经常地将公共密钥和私有密钥存储在" KeyStore"中。

创建密钥库

我们可以通过调用Java的KeyStore实例的getInstance()方法来创建它。这是创建KeyStore实例的示例:

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

本示例创建Java默认类型的KeyStore实例。也可以通过将不同的参数传递给getInstance()方法来创建其他类型的KeyStore实例。例如,下面的示例创建一个类型为KeyStore的PKCS12:

KeyStore keyStore = KeyStore.getInstance("PKCS12");

加载密钥库

必须先加载KeyStore实例,然后才能使用它。通常将" KeyStore"实例写入磁盘或者其他类型的存储中,以备后用。这就是为什么KeyStore类假定我们必须先读取其数据,然后才能使用它。但是,可以初始化一个没有数据的空KeyStore实例,这将在以后看到。

从文件或者其他存储中加载KeyStore数据是通过调用KeyStore的load()方法完成的。 load()有两个参数:

  • 一个InputStream,从中可以加载KeyStore数据。
  • 包含KeyStore密码的char [](char数组)。

这是加载JavaKeyStore的示例:

char[] keyStorePassword = "123abc".toCharArray();
try(InputStream keyStoreData = new FileInputStream("keystore.ks")){
    keyStore.load(keyStoreData, keyStorePassword);
}

本示例加载位于keystore.ks文件中的KeyStore文件。

如果我们不想将任何数据加载到KeyStore中,只需为InputStream参数传递null即可。这是加载空的KeyStore的样子:

keyStore3.load(null, keyStorePassword);

我们必须始终使用数据或者使用null加载KeyStore实例。否则,KeyStore将未初始化,并且对其方法的所有调用都将引发异常。

获取钥匙

我们可以通过其getEntry()方法获取Java KeyStore实例的密钥。 " KeyStore"条目映射到标识密钥的别名,并由密钥密码保护。因此,要访问密钥,我们必须将密钥别名和密码传递给getEntry()方法。这是访问KeyStore实例中的键条目的示例:

char[] keyPassword = "789xyz".toCharArray();
KeyStore.ProtectionParameter entryPassword =
        new KeyStore.PasswordProtection(keyPassword);

KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);

如果知道要访问的密钥条目是私钥,则可以将KeyStore.Entry实例强制转换为KeyStore.PrivateKeyEntry。看起来是这样的:

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)
        keyStore3.getEntry("keyAlias", entryPassword);

强制转换为KeyStore.PrivateKeyEntry之后,我们可以通过以下方法访问私钥,证书和证书链:

  • getPrivateKey()
  • getCertificate()
  • getCertificateChain()

设定键

我们还可以将密钥设置为" KeyStore"实例。以下是将私钥(对称密钥)设置为" KeyStore"实例的示例:

SecretKey secretKey = getSecretKey();
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);

keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);

存储密钥库

有时我们可能想将" KeyStore"存储到某些存储设备(磁盘,数据库等)中,以便下次可以再次加载它。我们可以通过调用store()方法来存储KeyStore。这是存储KeyStore的示例

char[] keyStorePassword = "123abc".toCharArray();
try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) {
    keyStore3.store(keyStoreOutputStream, keyStorePassword);
}