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); }