zoukankan      html  css  js  c++  java
  • 对象存储的下载凭证demo

    概述:

    前端需要把 桶的url 和 文件名传入 ,并且我们需要进行验证请求进来用户身份的校验

    然后把获取到的 桶域名 和文件名 按照公开空间访问方式构建对应的公开空间访问连接,然后再对这个这个链接进行私有授权签名 ,返回给 前端,和公开资源URL 相比增加了两个参数 一个是e 代表过期时间(秒为单位),还有一个是 token 代表下载凭证

    使用的是七牛云  , maven 添加上sdk 依赖

            <dependency>
                <groupId>com.qiniu</groupId>
                <artifactId>qiniu-java-sdk</artifactId>
                <version>[7.2.0, 7.2.99]</version>
            </dependency>

     编写个单元测试     

    fileName 是文件名  

    domainOfBucket  是桶的空间域名, 切记  url 前缀加上  http://   不然生成的url 会报 token  错误

     

    accessKey 和 secretKey  在密钥管理里面查看

    expireInSeconds 是设置的时间 ,以秒为单位
        @Test
        public void norm() throws UnsupportedEncodingException {
    
            String fileName = "Jellyfish.jpg";
            String domainOfBucket = "http://pu3myqsbm.bkt.clouddn.com";
            String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
            String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
    
            String accessKey = "x";
            String secretKey = "x";
            Auth auth = Auth.create(accessKey, secretKey);
            long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
            String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
            System.out.println(finalUrl);
        }

      token  原理的一些个人理解:

    (1)调用 string.getBytes() 将 secretKey(密钥)  转为byte[] 数组

    (2) 生成  javax.crypto.spec.SecretKeySpec 对象      参数1( 密钥生成的 byte[] ) , 参数2 ("HmacSHA1")  指定加密算法

     ( 3)调用 javax.crypto,Mac.getInstance("HmacSHA1") 以hash1 算法 生成 javax.crypto.Mac 对象

    (3)调用生成 mac 对象的 init(secretKey) 初始化方法 ,参数是  步骤2  生成的 SecretKeySpec对象的 secretKey

    (4)这时候生成了mac 对象 调用 mac.doFinal() 参数是 token 前面的url 

    http://pu3myqsbm.bkt.clouddn.com/Jellyfish.jpg?e=1562291474 的byte[] 数组 进行加密

    (5)然后在进行 Base64的 编码成 string 返回 下载签证

    (6)token 的组成拼接:   accessKey + : + encodedSign(secretKey生成的加密mac 和 http://pu3myqsbm.bkt.clouddn.com/Jellyfish.jpg?e=1562291474 加密的 data 组合而成的encodedSign)

    个人感觉原理 应该是 两端都进行 加上时间戳 的加密算法加密 然后判断是否一致,或者是在服务端进行解密 先进行时间校验 ,然后在加密对比验证

    如有错误,恳请指出!

  • 相关阅读:
    算法_二叉查找树
    Java编程思想学习笔记_2(继承和多态)
    算法_符号表
    算法_优先队列
    算法_快速排序
    Java编程思想学习笔记_1(Java内存和垃圾回收)
    map 与 lambda 的用法
    优化版九九乘法表
    low版九九乘法表
    python3爬虫lxml模块的安装
  • 原文地址:https://www.cnblogs.com/blogspring/p/14191773.html
Copyright © 2011-2022 走看看