Java中的密码学。 密钥库类

哈Ha! 我向您介绍了Jakob Jenkov撰写的“ Java KeyStore”第9条的译文,该系列文章适用于希望学习Java密码学基础知识的初学者


目录:


  1. Java密码学
  2. Java密码
  3. 留言摘要
  4. Mac电脑
  5. 签章
  6. 密钥对
  7. 密钥生成器
  8. 密钥对生成器
  9. 密钥库
  10. 按键工具
  11. 证明书
  12. 证书工厂
  13. 证书路径

密钥库


Java KeyStore是由KeyStore类( java.security.KeyStore )提供的数据库风格的密钥库。 可以将存储写入磁盘并再次读取,可以对其进行密码保护,并且可以使用自己的密码来保护密钥存储中的每个密钥记录,这使KeyStore类成为安全使用加密密钥的有用机制。 密钥库可以包含以下类型的密钥:


  • 私钥
  • 公钥和证书(公钥+证书)
  • 秘钥

私钥和公钥用于非对称加密。 公钥可以具有关联的证书。 证书是证明声称拥有公钥的个人,组织或设备的身份的文档。 证书通常由依赖方进行数字签名作为证据。 私钥用于对称加密。 在大多数情况下,建立安全连接时,对称密钥要比非对称密钥逊色,因此大多数情况下,您会将公钥和私钥存储在密钥库中。


创建密钥库


您可以通过调用KeyStoregetInstance()方法来创建其实例。 这是创建类实例的示例:


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

本示例创建一个默认的KeyStore实例。 您还可以通过将参数传递给getInstance()方法来创建具有不同密钥存储格式的KeyStore实例。 例如,创建PKCS12密钥库的实例:


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

下载密钥库


必须先下载密钥库实例,然后才能使用它。 通常,将KeyStore类的实例写入磁盘或其他存储中以供以后使用,因为KeyStore类假定您必须先读取其数据,然后才能使用它。 但是,您可以初始化一个没有数据的空KeyStore实例,这将在以后看到。


通过调用load()方法从文件或其他存储中加载数据,该方法带有两个参数:


  • InputStream ,将从中加载数据。
  • char[]包含来自密钥库的密码的字符数组。

这是加载密钥库的示例:


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

Source: https://habr.com/ru/post/zh-CN445786/


All Articles