摘要:基于時間戳防盜鏈的功能其實每家的都是支持的。算法說明基于時間戳的防盜鏈?zhǔn)峭ㄟ^對時間有關(guān)的字符串進行簽名,將時間,簽名通過一定的方式傳遞給服務(wù)器作為判定依據(jù),邊緣節(jié)點依據(jù)約定的算法判斷來訪的是否有訪問權(quán)限。
基于時間戳防盜鏈的功能其實每家的CDN都是支持的。主要是通過使用約定的加密字符串來對具有訪問有效期的資源鏈接進行一些加密計算的到一個sign值,然后訪問外鏈里面帶上這個sign和截止時間戳去訪問CDN的節(jié)點,CDN的節(jié)點會用同樣的算法來計算訪問鏈接是否合法,如果不合法則返回403 Forbidden,否則返回所要訪問的資源。
算法說明
基于時間戳的防盜鏈?zhǔn)峭ㄟ^對時間有關(guān)的字符串進行簽名,將時間,簽名通過一定的方式傳遞給CDN服務(wù)器作為判定依據(jù),CDN邊緣節(jié)點依據(jù)約定的算法判斷來訪的URL是否有訪問權(quán)限。
如果通過,執(zhí)行下一步;如果不通過,響應(yīng) HTTP 狀態(tài)碼 403。如果同時配置了Referer方式防盜鏈,UserAgent防盜鏈,時間戳防盜鏈,那么如果有其中一項沒有通過,那么即響應(yīng)403。
簽名參數(shù)
參數(shù) | 描述 |
---|---|
T | URL過期的時間,把Unix以秒為單位的時間戳,用16進制的小寫字母形式表示。比如 2016-06-30 22:57:42 +0800 CST 對應(yīng)的時間戳是 1467298662 ,表示為16進制就是 57753366。 |
key | 和CDN約定好的加密字符串 |
path | 訪問資源外鏈的PATH部分,比如如果訪問的外鏈?zhǔn)?b>http://if-pbl.qiniudn.com/golang.png?v=1那么其中PATH部分就是/golang.png |
簽名算法
待簽名的原始字符串 s=key+path+T
簽名方式 sign=md5(s).to_lower() ,其中to_lower()表示生成的md5字符串用小寫字母表示
簽名參數(shù)傳遞方式
例如原始訪問外鏈?zhǔn)牵?b>http://if-pbl.qiniudn.com/golang.png?v=1
最終形成的訪問外鏈?zhǔn)牵?b>http://if-pbl.qiniudn.com/golang.png?v=1&sign=xxxx&t=xxxx
其中xxxx對應(yīng)各自的值。
算法參考實現(xiàn)
package com.qiniulab.cdn; 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; public class CdnAntiLeech { /** * 生成資源基于CDN時間戳防盜鏈的訪問外鏈 * * @param 資源原始外鏈 * @param 結(jié)果資源的有效期,單位秒 * @throws MalformedURLException * @throws UnsupportedEncodingException * @throws NoSuchAlgorithmException */ public static String getAntiLeechAccessUrlBasedOnTimestamp(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; } 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); } }
使用方式
// cdn 配置的基于時間戳防盜鏈的加密字符串,cdn 配置完成后會得到 String encryptKey = ""; // 待加密鏈接 String fileKey = "xxxx.pdf"; String encodedFileKey; try { // 考慮到文件名稱會有中文,所以需要做urlencode encodedFileKey = URLEncoder.encode(fileKey, "utf-8"); String urlToSign = String.format("http://img.abc.com/%s", encodedFileKey); // 有效期 int duration = 3600; String signedUrl = CdnAntiLeech.getAntiLeechAccessUrlBasedOnTimestamp(urlToSign, encryptKey, duration); System.out.println(signedUrl); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/10952.html
摘要:遠程醫(yī)療這一概念被提出后,已經(jīng)被廣泛應(yīng)用。但是,如何提高視頻傳輸性能,如何確保家庭基層醫(yī)療機構(gòu)和戶外應(yīng)急的遠程醫(yī)療快速接入,是當(dāng)前的遠程醫(yī)療業(yè)務(wù)系統(tǒng)面臨的主要挑戰(zhàn)。 編者按:近日,Gartner最新發(fā)布了一份《Five Key Essentials for the New Generation of Intelligent Video Cloud》白皮書報告,報告中針對各行業(yè)在視頻應(yīng)用...
摘要:具體問題,就是中通過標(biāo)簽引入一個第三方的圖片地址,報。解決方案如原網(wǎng)址顯示此圖片來自微信公眾平臺,未經(jīng)允許不得應(yīng)用方法在標(biāo)簽里加這樣存在第三方網(wǎng)站上的圖片,在你的網(wǎng)站上就可以訪問了。 showImg(https://segmentfault.com/img/bVbtK8u?w=436&h=284); 問題 筆者網(wǎng)站的圖片都是上傳到第三方網(wǎng)站上的,比如 簡書、掘金、七牛云上的,但是最近簡...
摘要:七牛云接入本系統(tǒng)的圖片,音視頻是放在七牛云,所以需要接入七牛云。在服務(wù)端通過接口請求來獲取七牛云上傳,客戶端獲取到七牛云,通過不同方案將帶上。 效果展示 showImg(https://user-gold-cdn.xitu.io/2018/8/26/16576a709bd02f5f?w=1409&h=521&f=gif&s=30128195); showImg(https://user...
摘要:七牛云接入本系統(tǒng)的圖片,音視頻是放在七牛云,所以需要接入七牛云。在服務(wù)端通過接口請求來獲取七牛云上傳,客戶端獲取到七牛云,通過不同方案將帶上。 效果展示 showImg(https://user-gold-cdn.xitu.io/2018/8/26/16576a709bd02f5f?w=1409&h=521&f=gif&s=30128195); showImg(https://user...
閱讀 2237·2021-10-18 13:28
閱讀 2548·2021-10-11 10:59
閱讀 2371·2019-08-29 15:06
閱讀 1160·2019-08-26 13:54
閱讀 833·2019-08-26 13:52
閱讀 3172·2019-08-26 12:02
閱讀 3023·2019-08-26 11:44
閱讀 2550·2019-08-26 10:56