package com.nova.sankuai.infra.utils.baofu.rsa;
|
|
import com.nova.sankuai.infra.utils.baofu.FormatUtil;
|
|
import java.security.KeyFactory;
|
import java.security.PrivateKey;
|
import java.security.PublicKey;
|
import java.security.Signature;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
|
/**
|
* Created by BF100400 on 2017/4/17.
|
*/
|
public class SignatureUtils {
|
|
/**
|
* 加密算法RSA
|
*/
|
public static final String KEY_ALGORITHM = "RSA";
|
|
/**
|
* 签名算法
|
*/
|
public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
|
|
/**
|
* @encryptStr 摘要
|
* @signature 签名
|
* @pubCerPath 公钥路径
|
* 验签
|
*/
|
public static boolean verifySignature(String pubCerPath, String encryptStr, String signature) throws Exception {
|
PublicKey publicKey = RsaReadUtil.getPublicKeyFromFile(pubCerPath);
|
return verify(encryptStr.getBytes("UTF-8"),publicKey.getEncoded(), signature);
|
}
|
/**
|
* @encryptStr 摘要
|
* @pfxPath pfx证书路径
|
* @priKeyPass 私钥
|
* @charset 编码方式
|
* 签名
|
*/
|
public static String encryptByRSA(String encryptStr, String pfxPath, String priKeyPass)throws Exception {
|
PrivateKey privateKey = RsaReadUtil.getPrivateKeyFromFile(pfxPath, priKeyPass);
|
return sign(encryptStr.getBytes("UTF-8") ,privateKey.getEncoded());
|
}
|
|
/**
|
* 校验数字签名
|
* @param data 已加密数据
|
* @param keyBytes 公钥
|
* @param sign 数字签名
|
* @throws Exception
|
*
|
*/
|
public static boolean verify(byte[] data, byte[] keyBytes, String sign) throws Exception {
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
PublicKey publicK = keyFactory.generatePublic(keySpec);
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
signature.initVerify(publicK);
|
signature.update(data);
|
return signature.verify(FormatUtil.hex2Bytes(sign));
|
}
|
|
/**
|
*
|
* 用私钥对信息生成数字签名
|
* @param data 已加密数据
|
* @return
|
* @throws Exception
|
*/
|
public static String sign(byte[] data, byte[] keyBytes) throws Exception {
|
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
signature.initSign(privateK);
|
signature.update(data);
|
return FormatUtil.byte2Hex(signature.sign());
|
}
|
|
}
|