puzhibing
2023-08-16 c18ec3846c8483975de2224c1ecac9470e9b2804
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/MallBook/util/RSASignature.java
New file
@@ -0,0 +1,118 @@
package com.stylefeng.guns.modular.system.util.MallBook.util;
import com.stylefeng.guns.modular.system.util.MallBook.config.ChannelConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
 * @author RSA签名验签类
 */
public class RSASignature {
    public static Logger logger = LoggerFactory.getLogger(RSASignature.class);
    /**
     * 签名算法
     */
    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
    /**
     * 商户平台私钥签名
     *
     * @param content
     * @return
     */
    public static String sign(String content) {
        try {
            String privateKey = ChannelConfig.merchantPrivateKey;
            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
            KeyFactory keyf = KeyFactory.getInstance("RSA");
            PrivateKey priKey = keyf.generatePrivate(priPKCS8);
            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
            signature.initSign(priKey);
            signature.update(content.getBytes());
            byte[] signed = signature.sign();
            return Base64.encode(signed);
        } catch (Exception e) {
            logger.error("签名失败{}", e);
        }
        return null;
    }
    /**
     * 读取证书
     *
     * @param filePath 证书文件路径
     */
    public static String loadKey(String filePath) throws Exception {
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String readLine;
            StringBuilder sb = new StringBuilder();
            while ((readLine = br.readLine()) != null) {
                sb.append(readLine);
            }
            return sb.toString();
        } catch (IOException e) {
            throw new Exception("私钥数据读取错误");
        } catch (NullPointerException e) {
            throw new Exception("私钥输入流为空");
        }
    }
    /**
     * mallbook公钥验签
     *
     * @param content 待签名数据
     * @param sign    签名值
     * @return false 验签失败 true 成功
     */
    public static boolean validate(String content, String sign) {
        boolean verify = false;
        try {
            String publicKey = ChannelConfig.mallBookPublicKey;
            verify = RSASignature.doCheck(content, sign, publicKey, "utf-8");
        } catch (Exception e) {
            logger.error("验签失败:{}", e);
        }
        return verify;
    }
    /**
     * RSA验签
     *
     * @param content   待签名数据
     * @param sign      签名值
     * @param publicKey 分配给开发商公钥
     * @param encode    字符集编码
     * @return 布尔值
     */
    public static boolean doCheck(String content, String sign, String publicKey, String encode) {
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            byte[] encodedKey = Base64.decode(publicKey);
            PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
            signature.initVerify(pubKey);
            signature.update(content.getBytes(encode));
            return signature.verify(Base64.decode(sign));
        } catch (Exception e) {
            logger.error("验签失败{}", e);
        }
        return false;
    }
}