哈Ha! 我向您介绍了Jakob Jenkov撰写的“ Java KeyStore”第9条的译文,该系列文章适用于希望学习Java密码学基础知识的初学者 。
目录:
- Java密码学
- Java密码
- 留言摘要
- Mac电脑
- 签章
- 密钥对
- 密钥生成器
- 密钥对生成器
- 密钥库
- 按键工具
- 证明书
- 证书工厂
- 证书路径
密钥库
Java KeyStore是由KeyStore类( java.security.KeyStore )提供的数据库风格的密钥库。 可以将存储写入磁盘并再次读取,可以对其进行密码保护,并且可以使用自己的密码来保护密钥存储中的每个密钥记录,这使KeyStore
类成为安全使用加密密钥的有用机制。 密钥库可以包含以下类型的密钥:
私钥和公钥用于非对称加密。 公钥可以具有关联的证书。 证书是证明声称拥有公钥的个人,组织或设备的身份的文档。 证书通常由依赖方进行数字签名作为证据。 私钥用于对称加密。 在大多数情况下,建立安全连接时,对称密钥要比非对称密钥逊色,因此大多数情况下,您会将公钥和私钥存储在密钥库中。
创建密钥库
您可以通过调用KeyStore
的getInstance()
方法来创建其实例。 这是创建类实例的示例:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
本示例创建一个默认的KeyStore
实例。 您还可以通过将参数传递给getInstance()
方法来创建具有不同密钥存储格式的KeyStore实例。 例如,创建PKCS12
密钥库的实例:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
下载密钥库
必须先下载密钥库实例,然后才能使用它。 通常,将KeyStore
类的实例写入磁盘或其他存储中以供以后使用,因为KeyStore
类假定您必须先读取其数据,然后才能使用它。 但是,您可以初始化一个没有数据的空KeyStore
实例,这将在以后看到。
通过调用load()
方法从文件或其他存储中加载数据,该方法带有两个参数:
这是加载密钥库的示例:
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
本示例将加载keystore.ks密钥库文件。 如果您不想将任何数据加载到密钥库中,只需为InputStream
参数传递null
。 这是加载空密钥库的样子:
keyStore3.load(null, keyStorePassword);
KeyStore
类的实例KeyStore
始终加载data或null
。 否则,密钥库不会被初始化,并且对其方法的所有调用都将引发异常。
接收钥匙
您可以通过其getEntry()
方法获取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);
贮藏
有时您可能希望将密钥库保存到某种类型的存储(磁盘,数据库等)中,以便下次可以再次加载它。 通过调用store()
方法保存KeyStore
类的实例。 一个例子:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }