七牛云存储基于时间戳防盗链算法参考实现
基于时间戳防盗链的功能其实每家的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 {// 考虑到文件名称会有中文,所以需要做urlencodeencodedFileKey = 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();
}
七牛云存储基于时间戳防盗链算法参考实现相关推荐
- php 七牛时间戳防盗链,时间戳防盗链
1. 简介 七牛 CDN 支持多种访问控制方式:其中,时间戳防盗链可以通过对时间有关的字符串进行签名,将时间.签名信息通过一定的方式传递给 CDN 边缘节点服务器进行鉴权,从而正确响应合法请求.拒绝非 ...
- 使用七牛云存储在网站中进行图片外链
在CSDN中写博客,如果想在文章中插入一张图片,其实是非常简单的,只要从你本机进行图片选择,然后选择上传,图片就会上传到CSDN的服务器,到时候在文章显示的时候就会读取该图片.但是如果是在自己的搭建的 ...
- 在 Laravel 5 中集成七牛云存储实现云存储功能
本扩展包基于https://github.com/qiniu/php-sdk开发,是七牛云储存 Laravel 5 Storage版,通过本扩展包可以在Laravel 5中集成七牛云存储功能. 1.安 ...
- 使用七牛云存储解决ios7.1的app部署问题 https
2019独角兽企业重金招聘Python工程师标准>>> 使用七牛云存储解决ios7.1的app部署问题 一.问题描述 开发完iOS版本的app.需要将.ipa文件和.plist文件打 ...
- 使用七牛云存储解决ios7.1的app部署问题
使用七牛云存储解决ios7.1的app部署问题 一.问题描述 开发完ios版本的app.需要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描述如下: 首先通过手机浏览 ...
- 使用七牛云存储解决app部署问题,免申请https认证
一.问题描述 开发完ios版本的app.需要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描述如下: 首先通过手机浏览器safari或者扫描二维码获取到下载.plis ...
- 添加七牛云存储_七牛云存储如何正确设置流量带宽告警配置(阈值告警)?
经常有人说使用七牛云如果不正确设置流量带宽告警配置(也就是阀值告警)的话,很可能一觉起来房子就是人家的了,所以昨晚特意去七牛云存储设置一个流量阀值,我也担心第二天起来房子就是别人的了.下面跟大家简单介 ...
- 七牛云存储详细配置步骤
七牛云存储详细配置步骤 七牛云有免费的10G存储空间和流量,非常适合初创期的个人站长使用.初次使用看到那么多配置不知该如何下手,虽然官方也有详细的说明文档,但都是单独介绍,一半让人难以读懂.本人也是研 ...
- ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛
ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛 介绍 ThinkPHP6中使用flysystem作为文件处理类,flysystem是一个php文件处理库,可以使用相同的接口连接本地,ft ...
最新文章
- L1-027 出租 (C++暴力解法)
- SpringBoot中在普通类里面加载Spring容器中的类
- Angular JS 中的内置方法之表单验证
- opengl加载显示3DS模型3DS类型文件
- 原生js cookie本地存储
- 小学三年级上册计算机计划,小学三年级数学上册教学计划
- 信息学奥赛一本通C++语言——1039:判断数正负
- java scan hbase_hbase+java实例,Scan查询所有、get根据rowkey查询一行或一列数据
- 编译“have the same erasure, yet neither overrides“
- PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码
- Codeforces Round #222 (Div. 1) D. Developing Game 扫描线
- 库卡 KUKA 机器人仿真软件sim pro 教程
- ferguson博弈_博弈 - xiaoguozi's Blog - C++博客
- 怎么快速提高网站打开速度-网站打开速度优化教程技巧
- 探测器类的电路设计流程框图
- 基于thrift的匹配操作
- annotate 函数的用法
- maya xgen基础头发
- java代理模式解析
- HttpServletResponse响应图片,文字
热门文章
- TF卡里删掉文件后内存没变大_为何手机存储空间还没用就快满了?删掉这些隐藏冗余文件满血复活...
- 螺旋传动设计系统lisp_[罗升机电]第236期 丝杆升降机系统工程之齿轮传动的设计!...
- idea重写接口没有@override_【自学C#】|| 笔记 19 接口
- java微信刷卡支付demo_微信刷卡支付例子
- python计算密集型提速_揭秘Numpy“高效使用哲学”,数值计算再提速10倍!
- vb不能插入png图片_VB6.0载入PNG格式图片
- java常用类的特征_Java常用类-包装类
- linux 清除mysql relay_MySQL 小版本升级
- 4K 海思 联咏 芯片_强悍芯片,重装来袭-海美迪H7 Plus旗舰4K电视盒子体验
- 安装2000数据库的时候挂起