package com.heyu.api.alibaba; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.UUID; public class AliyunCDNAuthA { /** * 生成阿里云CDN鉴权方式A的加密URL * * @param filePath 文件路径,以/开头,如 "/video/test.mp4" * @param expiresInSeconds 过期时间(从当前算起的秒数) * @return 完整的加密URL */ public static String generateAuthUrl(String privateKey,String domainName,String filePath, long expiresInSeconds) { try { // 1. 生成时间戳(当前时间 + 过期时间) long timestamp = (System.currentTimeMillis() / 1000) + expiresInSeconds; // 2. 生成随机数(去掉UUID中的短横线) String rand = UUID.randomUUID().toString().replace("-", ""); // 3. 设置uid为0 String uid = "0"; // 4. 计算md5hash String md5hash = calculateMd5Hash(privateKey,filePath, timestamp, rand, uid); // 5. 构建鉴权URL return "http://" + domainName + filePath + "?auth_key=" + timestamp + "-" + rand + "-" + uid + "-" + md5hash; } catch (Exception e) { throw new RuntimeException("生成鉴权URL失败", e); } } /** * 计算MD5哈希值 */ private static String calculateMd5Hash(String privateKey,String filePath, long timestamp, String rand, String uid) throws NoSuchAlgorithmException { // 构造签名字符串 String signString = filePath + "-" + timestamp + "-" + rand + "-" + uid + "-" + privateKey; // 计算MD5 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(signString.getBytes()); // 转换为十六进制字符串 StringBuilder hexString = new StringBuilder(); for (byte b : digest) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } /** * 使用示例 */ public static void main(String[] args) { // 初始化鉴权对象 String privateKey = "heyuquyixiao123456"; // 替换为你的密钥 String domainName = "heyuimage.ihzhy.com"; // 替换为你的CDN域名 // 生成鉴权URL,有效时间30分钟(1800秒) String filePath = "/ccc.jpeg"; String authUrl = AliyunCDNAuthA.generateAuthUrl(privateKey,domainName,filePath, 1800); System.out.println("生成的鉴权URL: " + authUrl); } }