package com.szwl.util; import cn.hutool.core.util.RandomUtil; import com.huifu.bspay.sdk.opps.core.utils.DateTools; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; 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; import java.util.Base64; @Slf4j public class HuifuUtils { /** * RSA私钥签名:签名方式SHA256WithRSA * @param data 待签名字符串 * @param privateKeyBase64 私钥(Base64编码) * @return 签名byte[] * @throws Exception */ public static String sign(String data, String privateKeyBase64) { // Base64 --> Key try { byte[] bytes = Base64.getDecoder().decode(privateKeyBase64); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // Sign Signature signature = Signature.getInstance("SHA256WithRSA"); signature.initSign(privateKey); signature.update(data.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(signature.sign()); } catch (Exception e) { return null; } } /** * 使用汇付RSA公钥验签 * @param data 待签名字符串 * @param publicKeyBase64 公钥(Base64编码) * @return 验签结果 * @throws Exception */ public static boolean verify(String data, String publicKeyBase64, String sign) { // Base64 --> Key try { byte[] bytes = Base64.getDecoder().decode(publicKeyBase64); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); // verify Signature signature = Signature.getInstance("SHA256WithRSA"); signature.initVerify(publicKey); signature.update(data.getBytes("UTF-8")); return signature.verify(Base64.getDecoder().decode(sign)); } catch (Exception e) { log.error("Exception", e); return false; } } /** * 生成随机流水号 * @return */ public static String initReqSeqId() { String numbers = RandomUtil.randomNumbers(10); return new StringBuilder(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers).toString(); } /** * 转base64为图片 * @param base64Str * @return * @throws IOException */ public static File base64ToTempImage(String base64Str) throws IOException { // 解码base64字符串 byte[] imageBytes = Base64.getDecoder().decode(base64Str.split(",")[1]); // 创建一个临时文件 File tempFile = File.createTempFile("temp_image", ".jpg"); // 将解码后的数据写入临时文件 try (FileOutputStream fos = new FileOutputStream(tempFile)) { fos.write(imageBytes); } // 返回临时文件 return tempFile; } }