package com.ruoyi.payment.infrastructure.util; import org.apache.commons.codec.digest.DigestUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; /** * 签名工具类 * * @author ruoyi */ public class SignUtil { /** * MD5签名 * * @param data 待签名数据 * @return 签名结果 */ public static String md5(String data) { return DigestUtils.md5Hex(data).toUpperCase(); } /** * HMAC-SHA256签名 * * @param data 待签名数据 * @param secret 密钥 * @return 签名结果(Base64编码) */ public static String hmacSha256(String data, String secret) { try { Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec( secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256" ); mac.init(secretKeySpec); byte[] bytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(bytes); } catch (NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException("HMAC-SHA256签名失败", e); } } /** * 验证HMAC-SHA256签名 * * @param data 原始数据 * @param secret 密钥 * @param signature 签名 * @return 是否验证通过 */ public static boolean verifyHmacSha256(String data, String secret, String signature) { String calculated = hmacSha256(data, secret); return calculated.equals(signature); } }