近来有一个加密加签的需求,需要对数据加密传出去。学到了很多,记录一下。
1:证书获取私匙
由于是对老代码的维护,所以之前是写好的。原代码逻辑是从证书中获取密钥。
证书为pfx后缀的文件,可使用keytool证书管理工具生成。具体创建可参考这篇博客:java获取安全证书名_java 生成本地ssl安全证书 springboot配置_LHZ5388015210的博客-CSDN博客
具体处理代码为:
//读取证书
InputStream in = new FileInputStream("//***.pfx");
//获取指定类型的密匙库(KeyStore是证书和私匙的存储设施)
KeyStore keystore = KeyStore.getInstance("PKCS12");
//解锁证书
keystore.load(证书文件,密码(字符数组));
//获取密匙库所有别名
Enumeration<String> enumeration = keystore.aliases();
String alias = null;
PrivateKey privateKey = null;
//遍历元素
while(enumeration.hasMoreElements()) {
alias = ((String)enumeration.nextElement()).toString();
Key key = keystore.getKey(alias, 密码(字符数组));
if (key != null && key instanceof PrivateKey) {
privateKey = (PrivateKey)key;
break;
}
}
2:PKCS8EncodedKeySpec加载密匙
PKCS8EncodedKeySpec类使用PKCS#8标准作为密钥规范管理的编码格式,以编码格式来表示私钥。目前多使用这种方式。
1:首先定义私匙字符串,例如
2:获取私匙
//获得私钥密钥字节数组
byte[] keyBytes = Base64Utils.decode(privateKey);
//PKCS8EncodedKeySpec类使用PKCS#8标准作为密钥规范管理的编码格式,以编码格式来表示私匙
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
//获取指定算法的密匙工厂实例(算法有很多,根据实际需求选择)
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//使用密匙材料生成私匙对象
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
3:生成签名
使用Signature对象生成签名。这里放出签名算法及流程,供参考。
//获取指定算法的签名实例(如:SHA1WithRSA)
Signature signature = Signature.getInstance(“SHA1WithRSA”);
//添加生成签名的私匙及数据
signature.initSign(私匙对象PrivateKey);
signature.update(data.getBytes(StandardCharsets.UTF_8));
//生成签名
byte[] sign = signature.sign();
//把字节数组形式的签名转换成16进制
String signStr = ByteUtil.bytesToHexString(signed);
至此,获取私匙并生成签名就完成了,这里只做简单演示,实际使用还是要看业务需求,酌情使用。