今天在遇到一个这样的需求: 加密机需要用外部导入的公钥来进行验签。 刚开始需求给的方案是加密机先用密钥对发个证,再用证书的base64字符串传输公钥。通过证书是可以获取到公钥对象的。
有几点不好:
- 需要先用密钥对签发证书
- 用的时候需要从证书中获取公钥
- 证书只是作为一个载体,并没有其他用处
所以我提出直接将密钥对中的公钥序列化成字符串传输。导入时再反序列化成公钥对象。话不多说直接上代码:
/**
* 示例返回:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEwS7Rs9WvyOgxBqv8A0QMe4eT1Y6ywXeo7WfohXdkZsxfYGH5oUq+qPfiGbNNtjePBjdL/Hf0V7rTaBFrEJ526A==
* @param pubkey 公钥对象
* @return
* @throws UnsupportedEncodingException
*/
public static String pubToString(PublicKey pubkey) throws UnsupportedEncodingException {
return new String(Base64Util.encode(pubkey.getEncoded()),"utf8");
}
/**
*
* @param pubString 序列化后的字符串
* @return
* @throws UnsupportedEncodingException
* @throws InvalidKeySpecException
* @throws NoSuchAlgorithmException
*/
public static PublicKey stringToPub(String pubString) throws UnsupportedEncodingException, InvalidKeySpecException, NoSuchAlgorithmException {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64Util.decode(pubString.getBytes("UTF8")));
KeyFactory keyFactory = KeyFactory.getInstance("SM2"); //这里填加密机支持的算法名,我这里是引入了鱼翁的加密机。 如果你的是BC库填 EC 如果你是rsa的密钥对 填:RSA
return keyFactory.generatePublic(x509EncodedKeySpec);
}
如上就是公钥对象的序列化及反序列化的全部内容!