/** * 用私钥对信息生成数字签名 * * @param data 需要签名的数据 * @param privateKey 用来签名的私钥 * @return 对数据的签名 * @throws NoSuchAlgorithmException 假如用户的JDK不支持RSA * @throws InvalidKeySpecException 假如根据privateKey生成密钥失败 * @throws InvalidKeyException 假如输入的RSA私钥不合法 * @throws SignatureException 假如根据privateKey生成密钥失败 * @throws UnsupportedEncodingException 假如privateKey不是使用UTF-8进行编码 */ public static String sign(byte[] data, String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException, UnsupportedEncodingException { // 解密由base64编码的私钥 byte[] keyBytes = Base64ForServer.base64toByte(privateKey); // 构造PKCS8EncodedKeySpec对象 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取私钥匙对象 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); // 用私钥对信息生成数字签名 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(data); return Base64ForServer.byteToBase64(signature.sign()); }
/** * 取得公钥 * * @param keyMap 密钥对Map * @return 公钥 * @throws UnsupportedEncodingException 假如用户的环境不支持UTF-8 */ public static String getPublicKey(Map<String, Object> keyMap) throws UnsupportedEncodingException { Key key = (Key) keyMap.get(PUBLIC_KEY); return Base64ForServer.byteToBase64(key.getEncoded()); }