Java密码学

来源:互联网 发布:淘宝助理数据包 编辑:程序博客网 时间:2024/06/05 11:20

代码

源码(Javadoc)对keystore的操作做了很好的说明

读取keystore

KeyStore keystore = KeyStore.getInstance("JKS");//证书类型 常见: JKS,PKCS12InputStream is = new FileInputStream(keystore路劲);keystore.load(is, keystore密码);

创建keystore

keyStore = KeyStore.getInstance("JKS");keyStore.load(null, null);//这一步不可以省略操作keyStore.store(FileUtils.openOutputStream(new File(储存的文件名)), 密码.toCharArray());

读取证书

keyStore.getCertificateChain(名称);

当不知道alias时候, keystore只有一张时

KeyStore keyStore=...;keyStore.getCertificateChain(Collections.list(keyStore.aliases()).get(0));

因为只有keyStore.aliases()方法读取名称, 而且其返回类型 Enumeration, 可用Enumeration遍历的方式, 如果是JDK 8 则可以用lambda简单处理

读取密钥

Key key =  keyStore.getKey(名称, key的密码);

简介&&细节

keystore 源码
This class represents a storage facility for cryptographic keys and certificates.

keystore是储存密钥和证书的设备

KeyStore可以存储三种类型数据

  1. PrivateKey 私钥
  2. SecretKey 对称密钥
  3. TrustedCertificateEntry 证书

每种数据都有自己的名称(alias)

1.储存SecretKey(源码)

KeyStore.ProtectionParameter protParam =  new KeyStore.PasswordProtection(password);// save my secret key    javax.crypto.SecretKey mySecretKey;    KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey);    ks.setEntry("secretKeyAlias", skEntry, protParam);
2. 储存私钥和证书链
这里需要说明以下, 私钥只能自己保存, 而公钥可以拿去不同机构生成不同证书, 所以方便管理, 私钥是和证书链一起管理.
PrivateKey privateKey=...;Certificate[] chain=...;keyStore.setKeyEntry(名称, privateKey, 密码, chain);//密码可以缺省, 即使用keystore的密码
3. 增加证书到证书链
这里没有现成的方法, 只能自己手动读取, 再进行覆盖

番外

keystore常见有两种存储, PKCS12以及JKS

  1. PKCS12是可以直接导入浏览器, 所以有人会以为它是证书, 其实不是. 它与JKS是同样属性.
    为什么我们需要PFX, 当客户端不生成密钥对时候, 想要申请数字证书, 服务端就会生成密钥对,将公钥进行数字签名, 那客户端需要私钥解密怎么办? 那就只能将私钥和证书放在一起, 所以才有PFX这种格式
  2. JKS只能用于Java间使用
原创粉丝点击