专栏首页运维一切玩静态资源加密验证 原

玩静态资源加密验证 原

###背景 为了防止裸奔的静态图片和相关的附件被用户拿来随意拼装下载,需要研究特定的用户对特定资源的授权访问方案。当前为了满足大量用户的访问,web服务一般都有专用的静态资源服务器,逻辑服务器和静态资源服务域名不同、服务分开。进化高一些的大型站点,还有独立的验证服务。

###整体的架构方案 逻辑服务或者验证服务可以对每个静态资源计算一个特定的密码,访问静态资源时可以携带上这个密码,静态资源服务器在收到资源访问请求时先去解析密码,密码里有对资源路径的解密验证。

###静态资源服务器 采用nginx perl模块的方式进行验证。 ####nginx模块的编译

yum install -y perl-ExtUtils-Embed  openssl-devel openssl-static  openssl  libtool-ltdl  libtool-ltdl-devel
./configure --prefix=/usr/local/web/nginx-1.6.2 --with-http_ssl_module    --with-http_perl_module

需要自己安装libmcrypt(这个玩意太危险了,看起来已经很久维护了,这玩意能藏后门,fuck)

[root@localhost Mcrypt-2.5.7.0]# vim Makefile.PL
require 5.004 ; 
use ExtUtils::MakeMaker 5.16 ; 
use Config ;
$MCRYPT_LDFLAGS = "-L/usr/local/libmcrypt-2.5.7/lib" ; 
$MCRYPT_CPPFLAGS = "-I/usr/local/libmcrypt-2.5.7/include" ; 
WriteMakefile( 
NAME => 'Mcrypt', 
VERSION_FROM => 'Mcrypt.pm', 
LIBS => [ "$MCRYPT_LDFLAGS -lltdl -lmcrypt" ], 
INC => " $MCRYPT_CPPFLAGS" , 
);

####nginx的配置

    perl_modules lib;
    perl_require proxy.pm;
    perl_set $auth '
        sub {
            my $r = shift;
            return proxy::check($r);
        }
    ';

    server {
        listen  80;
        server_name myimg.com;
        root /root/web/blog/public;
        index index.html;
        if ($auth = 0) {
            return 400;
        }
        access_log logs/access_log combined;
    }

####proxy模块代理

package proxy;
use strict;
use DES;
use nginx;

sub check 
{
    my $r = shift;
    my $uri = $r->uri;
    my @uri_args = split(/&/, $r->args);
    my $auth_key  = "";
    my $flag = 0;
    foreach my $tmp (@uri_args) {
        $tmp=~s/^ +//;
        $tmp=~s/ +$//;
        my ($key, $value) = split(/=/, $tmp);
        if ($key eq "token") {
            $flag = 1; 
            $auth_key = $value;
            last;
        }
    }
    if ($flag == 1) {
        return auth($auth_key, $uri);
    } else {
        return 0;
    }
}
sub auth {
    my $ticket = shift;
    my $ino = shift;
    my $mode = shift || 'cfb';
    return () unless defined $ticket;
    my $salt = 'your password';
    my $td = new DES(key=>$salt, mode=>$mode); 
    my $data = $td->demcrypt($ticket);
    if ($data eq $ino) {
        return 1;
    } else {
        return 0;
    }
}
1;
__END__

####加密和解密的方式 加密方式和解密方式可以跟据自己的情况自行选择,写到DES.pm中,里面只要有demcrypt和enmcrypt方法就好了。算法你可以去追求性能,或者追求安全的,或者你他娘的自己造也行。 如果你使用laravel框架,这里可以直接使用自带的加解密 ####静态资源密码生成方式

function rsToken($uri_path){
	$salt = 'Yc1+04ox';
	$td = new DesService($salt);
	return $td->encrypt($uri_path);
}

DES的加密和解密php版本的可以参考这个传送门 这个代码略有点乱。 ####在需要权限验证的地方加上密码

<img src="//myimg.com/images/1.jpg?token={{rsToken('/images/1.jpg')}}">

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mdadm软RAID的删除方法和注意事项 转

    domain0
  • 在线调节文件系统大小中遇到的问题

    The Solution A file system inconsistency blocked the online resize of the disk, ...

    domain0
  • linux软raid制作记录

    domain0
  • R语言︱H2o深度学习的一些R语言实践——H2o包

    连接、搭建H2o环境(heo.init())——数据转换成h2o格式(as.h2o)——模型拟合(h2o.deeplearning)——预测(h2o....

    素质
  • Q122 Best Time to Buy and Sell Stock II

    Say you have an array for which the ith element is the price of a given stock on...

    echobingo
  • 四个最好的SaaS财务软件

    现在我们来谈谈一些最好的SaaS财务软件。是的,我知道我已经多次发布过这样的名单。但事实就是这样,新软件在不断出现或者原有软件通过改进,超越之前最好的软件,我会...

    Drake
  • 模式匹配(kmp)个人模板

    owent
  • 四个最好的SaaS财务软件

    现在我们来谈谈一些最好的SaaS财务软件。新软件在不断出现或者原有软件通过不断改进、多次更新迭代,超越之前最好的软件,我会在今后持续的更新,这些信息不断更新同样...

    MonroeCode
  • 军事仿真评估:评估标准的分类(CS CY)

    在军事模拟领域,有很多不同的方法。 近战战术教练机、联合战术战术训练系统、战斗力战术训练或作战人员模拟2000只是美国国防部大型建模与仿真开发项目历史上的一些例...

    用户7095611
  • Python提取docx文档中例题、插图、表格清单

    from docx import Document import re result = {'li':[], 'fig':[], 'tab':[], 'tuoz...

    Python小屋屋主

扫码关注云+社区

领取腾讯云代金券