Java密钥库
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);
}

