七牛云之 时间戳防盗链签名

概述:

在七牛portal平台,可以针对自定义域名(CDN加速域名)配置时间戳防盗链,但是在开启的时候需要写入一个“检查URL”,很多使用者不知道如何填写,所以通过该文章做一个简单的分享。

问题:

如何获取这个检查URL,并且输入校验成功?
七牛云之 时间戳防盗链签名_第1张图片

思路:

1.理解七牛的时间戳防盗链的实现方式;
2.了解七牛的算法
3.coding
Tips: 关于七牛的时间戳防盗链说明,可以查看下面的文档链接:
https://support.qiniu.com/question/category?id=99163&categoryTitle=%E8%9E%8D%E5%90%88CDN%E5%8A%A0%E9%80%9F&forumTitle=%E9%98%B2%E7%9B%97%E9%93%BE%E9%97%AE%E9%A2%98

代码示例如下:

package com.qiniu.kodo;

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;

/**
 * 七牛时间戳防盗链签名
 * @author xuhuanchao
 *
 */
public class TimeStampChain {

    /**
     * 获取时间戳 URL签名
     * @param url
     * @param encryptKey
     * @param durationInSeconds
     * @return
     * @throws MalformedURLException
     * @throws UnsupportedEncodingException
     * @throws NoSuchAlgorithmException
     */
    private static String getTimestamp(String url, String encryptKey, int durationInSeconds)
            throws MalformedURLException, UnsupportedEncodingException, NoSuchAlgorithmException {
        URL urlObj = new URL(url);
        String path = urlObj.getPath();

        long timestampNow = System.currentTimeMillis() / 1000 + durationInSeconds;
        String expireHex = Long.toHexString(timestampNow);

        String toSignStr = String.format("%s%s%s", encryptKey, path, expireHex);
        String signedStr = md5ToLower(toSignStr);

        String signedUrl = null;
        if (urlObj.getQuery() != null) {
            signedUrl = String.format("%s&sign=%s&t=%s", url, signedStr, expireHex);
        } else {
            signedUrl = String.format("%s?sign=%s&t=%s", url, signedStr, expireHex);
        }

        return signedUrl;
    }

    /**
     * MD5加密
     * @param src
     * @return
     * @throws UnsupportedEncodingException
     * @throws NoSuchAlgorithmException
     */
    private static String md5ToLower(String src) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(src.getBytes("utf-8"));
        byte[] md5Bytes = digest.digest();
        return Hex.encodeHexString(md5Bytes);
    }


    /**
     * Tester
     * @param args
     */
    public static void main(String args[]) {

        // cdn 配置的基于时间戳防盗链的加密字符串,cdn 配置完成后会得到
        String encryptKey = "0bb8fdbb129879aaf8b9c38ab88a37xxxxxxxxx";//截图中的主要key
        // 待加密链接
        String urlToSign = "http://o8cdypgaj.bkt.clouddn.com/1.png";
        // 有效期
        int duration = 3600;

        try {
            String signedUrl = getTimestamp(urlToSign, encryptKey, duration);
            System.out.println(signedUrl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(Qiniu)