用java写一个秘钥为qwe,有效时间为10分钟的url视频防盗链生成
时间: 2023-08-31 19:37:02 浏览: 51
### 回答1:
实现这个功能需要以下几个步骤:
1. 生成一个随机的token用于防盗链验证
2. 将当前时间加上10分钟作为过期时间
3. 将秘钥、过期时间和随机token组合成一个字符串
4. 对组合后的字符串进行加密,可以使用MD5或者SHA1等加密算法
5. 将加密后的字符串作为参数拼接到视频的URL中
下面是一个Java实现的示例代码:
```java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
public class VideoUrlGenerator {
private static final String KEY = "qwe";
private static final long EXPIRE_TIME = 10 * 60 * 1000; // 10分钟
public static void main(String[] args) {
String videoUrl = "http://example.com/video.mp4";
String token = generateToken();
String signature = generateSignature(KEY, token, new Date(System.currentTimeMillis() + EXPIRE_TIME));
String signedUrl = videoUrl + "?token=" + token + "&expire=" + (System.currentTimeMillis() + EXPIRE_TIME) + "&signature=" + signature;
System.out.println("Signed URL: " + signedUrl);
}
private static String generateToken() {
// 生成一个随机字符串作为token
return Long.toHexString(Double.doubleToLongBits(Math.random()));
}
private static String generateSignature(String key, String token, Date expireTime) {
String plainText = key + token + expireTime.getTime();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(plainText.getBytes());
return bytesToHex(bytes);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 algorithm not found", e);
}
}
private static final char[] HEX_ARRAY = "0123456789abcdef".toCharArray();
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xff;
hexChars[i * 2] = HEX_ARRAY[v >>> 4];
hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0f];
}
return new String(hexChars);
}
}
```
这个示例代码中,`KEY`是秘钥,`EXPIRE_TIME`是有效时间,`generateToken()`方法用于生成随机token,`generateSignature()`方法用于生成加密后的签名,`bytesToHex()`方法用于将字节数组转换为16进制字符串。最后生成的带签名的URL类似于这样:
```
http://example.com/video.mp4?token=abcdef1234567890&expire=1625660220486&signature=9d6dca04b62c85c8b63e9a9c29a2f7c1
```
其中`token`参数是随机生成的,`expire`参数是过期时间戳,`signature`参数是加密后的签名。在服务器端,可以根据这些参数验证请求是否合法。
### 回答2:
Java可以通过使用MD5算法来生成秘钥,并结合当前时间戳来判断链接是否还在有效时间内。
首先,需要引入Java中的MD5加密库:
```java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
```
然后,可以使用以下方法生成MD5哈希值:
```java
public static String generateMD5(String input) throws NoSuchAlgorithmException{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
```
接下来,可以编写生成防盗链url的方法。假设视频链接为"example.com/video.mp4",有效时间为10分钟,秘钥为"qwe"。
```java
import java.security.NoSuchAlgorithmException;
public class Main {
public static void main(String[] args) {
// 输入视频链接
String videoUrl = "example.com/video.mp4";
try {
// 生成时间戳
long timestamp = System.currentTimeMillis() / 1000;
// 设置有效时间为10分钟(600秒)
long expiration = timestamp + 600;
// 构建待签名字符串(格式为 "视频链接+时间戳+秘钥")
String signString = videoUrl + timestamp + "qwe";
// 使用MD5生成签名
String sign = generateMD5(signString);
// 构建防盗链url(格式为 "视频链接+时间戳+有效时间+签名")
String protectedUrl = videoUrl + "?t=" + timestamp + "&e=" + expiration + "&s=" + sign;
System.out.println(protectedUrl);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static String generateMD5(String input) throws NoSuchAlgorithmException{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
}
```
以上代码会输出带有时间戳、有效时间和签名的防盗链url,例如:`example.com/video.mp4?t=1628192562&e=1628193162&s=6258aca162b170b1ebe8b9ef0d9e7e7e`。这样,只有在有效时间内且正确携带签名的url才能访问对应的视频资源。