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