package com.xmkjsoft.protect_key;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
public class TencentKeyAntiTheft {
private static final String SECRET_KEY = ""; // 请替换为腾讯云 VOD 控制台中的 Key
/**
* 生成腾讯云 Key 防盗链 URL
* @param url 原始 URL
* @param t 过期时间戳(Unix 时间戳,需转换为 16 进制)
* @param exper 试看时间(可选)
* @param rlimit 限制最大 IP 数(可选)
* @return 带签名的 URL
*/
public static String generateSignedUrl(String url, long t, String exper, String rlimit) {
try {
// **获取 URL 目录部分(去掉域名,仅保留路径)**
String path = "/dir1/dir1/"; // 不能包含域名
// **转换时间戳为 16 进制**
String hexT = Long.toHexString(t);
// **生成随机字符串 us**
String us = "72d4cd1101";
// **访问控制字段,未启用则留空**
String whref = "";
String bkref = "";
String whreg = "";
String bkreg = "";
// **拼接待签名字符串**
String dataToSign = SECRET_KEY + path + hexT + exper + rlimit + us + whref + bkref + whreg + bkreg;
// **计算 MD5 签名**
String sign = md5(dataToSign);
// **生成最终 URL**
return url + "?t=" + hexT
+ "&exper=" + exper
+ "&rlimit=" + rlimit
+ "&us=" + us
+ "&sign=" + sign;
} catch (Exception e) {
throw new RuntimeException("生成 Key 防盗链 URL 失败", e);
}
}
/**
* 计算 MD5 签名(腾讯云要求的格式)
*/
private static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(data.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (Exception e) {
throw new RuntimeException("MD5 计算失败", e);
}
}
public static void main(String[] args) {
String originalUrl = "https://*******.com/dir1/dir2/v.f100230.m3u8";
long expires = System.currentTimeMillis() / 1000 + 3600; // 1 小时后过期
// 生成 Key 防盗链 URL(不启用试看,IP 限制)
String signedUrl = generateSignedUrl(originalUrl, expires, "", "");
System.out.println("✅ 腾讯 Key 防盗链 URL: " + signedUrl);
}
}
注意里面的/dir1/dir2/ 是域名后面的地址名称 那个是啥视频文件格式,详情看云点播API:key防盗链文档:https://cloud.tencent.com/document/product/266/14047