package cn.mb.cloud.auth.security.util; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.HashMap; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; public class TxSmsUtil { private final static Charset UTF8 = StandardCharsets.UTF_8; // 密钥参数,云API密匙查询: https://console.cloud.tencent.com/cam/capi private final static String SECRET_ID = "AKIDz8krbsJ5yKBZQpn74WFkmLPx3*******"; private final static String SECRET_KEY = "Gu5t9xGARNpq86cd98joQYCN3*******"; private final static String CT_JSON = "application/json; charset=utf-8"; public static byte[] hmac256(byte[] key, String msg) throws Exception { Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm()); mac.init(secretKeySpec); return mac.doFinal(msg.getBytes(UTF8)); } public static String sha256Hex(String s) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] d = md.digest(s.getBytes(UTF8)); return DatatypeConverter.printHexBinary(d).toLowerCase(); } /*public static void main(String[] args) throws Exception { String service = "sms"; String host = "sms.tencentcloudapi.com"; String region = "ap-guangzhou"; String action = "SendSms"; String version = "2021-01-11"; String algorithm = "TC3-HMAC-SHA256"; String timestamp = String.valueOf(System.currentTimeMillis() / 1000); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 注意时区,否则容易出错 sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String date = sdf.format(new Date(Long.valueOf(timestamp + "000"))); // ************* 步骤 1:拼接规范请求串 ************* String httpRequestMethod = "POST"; String canonicalUri = "/"; String canonicalQueryString = ""; String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n"; String signedHeaders = "content-type;host"; HashMap params = new HashMap<>(); // 实际调用需要更新参数,这里仅作为演示签名验证通过的例子 params.put("SmsSdkAppId", "1400006666"); params.put("SignName", "腾讯云"); params.put("TemplateId", "1234"); params.put("TemplateParamSet", new String[]{"12345"}); params.put("PhoneNumberSet", new String[]{"+8618511122266"}); params.put("SessionContext", "test"); Gson gson = new Gson(); String payload = gson.toJson(params); // String payload = "{\"Limit\": 1, \"Filters\": [{\"Values\": [\"\\u672a\\u547d\\u540d\"], \"Name\": \"instance-name\"}]}"; String hashedRequestPayload = sha256Hex(payload); String canonicalRequest = httpRequestMethod + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload; System.out.println(canonicalRequest); // ************* 步骤 2:拼接待签名字符串 ************* String credentialScope = date + "/" + service + "/" + "tc3_request"; String hashedCanonicalRequest = sha256Hex(canonicalRequest); String stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest; System.out.println(stringToSign); // ************* 步骤 3:计算签名 ************* byte[] secretDate = hmac256(("TC3" + SECRET_KEY).getBytes(UTF8), date); byte[] secretService = hmac256(secretDate, service); byte[] secretSigning = hmac256(secretService, "tc3_request"); String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase(); System.out.println(signature); // ************* 步骤 4:拼接 Authorization ************* String authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature; System.out.println(authorization); HashMap headers = new HashMap(); headers.put("Authorization", authorization); headers.put("Content-Type", CT_JSON); headers.put("Host", host); headers.put("X-TC-Action", action); headers.put("X-TC-Timestamp", timestamp); headers.put("X-TC-Version", version); headers.put("X-TC-Region", region); StringBuilder sb = new StringBuilder(); sb.append("curl -X POST https://").append(host) .append(" -H \"Authorization: ").append(authorization).append("\"") .append(" -H \"Content-Type: application/json; charset=utf-8\"") .append(" -H \"Host: ").append(host).append("\"") .append(" -H \"X-TC-Action: ").append(action).append("\"") .append(" -H \"X-TC-Timestamp: ").append(timestamp).append("\"") .append(" -H \"X-TC-Version: ").append(version).append("\"") .append(" -H \"X-TC-Region: ").append(region).append("\"") .append(" -d '").append(payload).append("'"); System.out.println(sb.toString()); }*/ }