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