探秘之阿里云 OSS 数据存储 API

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 为什么叫探秘 使用过阿里云 OSS 存储 API 的用户和客服都知道有一个通用的环节就是 Authorization 的计算,以及请求头的一些添加规范,给用户和客服烙下了不小的 “心理阴影” ,尤其 OSS Authorization  头的计算,光文章就密密麻麻的一篇(反正我的密集恐惧症犯了)。

为什么叫探秘



使用过阿里云 OSS 存储 API 的用户和客服都知道有一个通用的环节就是 Authorization 的计算,以及请求头的一些添加规范,给用户和客服烙下了不小的 “心理阴影” ,尤其 OSS Authorization  头的计算,光文章就密密麻麻的一篇(反正我的密集恐惧症犯了)。由于本人趟过坑今天就手把手,嘴对嘴的把过程说下,“活”儿不好,请各路老司机温柔以待!

官网的文章https://help.aliyun.com/document_detail/31951.html?spm=a2c4g.11186623.6.1012.5bb84b4e6wXZcI

PutObject  规范https://help.aliyun.com/document_detail/31978.html?spm=a2c4g.11186623.6.994.1632734cIiNNmj


先了解名词



AccessKey:访问云产品的凭证,类似宝藏的锁,可以是主账号或者 RAM 子账号的。

Access Key Secret:访问云产品的秘钥,类似宝藏的钥匙,可以是主账号或者 RAM 子账号的。

Authorization:Header 来包含签名(Signature)信息,表明这个消息已被授权。

Signature:经过各种计算得到的鉴权指纹信息。

CanonicalizedOSSHeaders:访问 OSS 时,用户想要加的自定义头,必须以 "x-oss-" 为头的前缀。如果使用,也必须要加到 Signature  中计算。

CanonicalizedResource:访问 OSS 的资源 object,结构是 /bucket/ object,来个板“例”

  •  /zhangyibo/Japan/video/tokhot.avi  将视频上传到 bucket 为 zhangyibo 的虚拟目录 Japan 下面,命名为 tokhot.avi ,可以是 PUT / GET 等操作。
  • /zhangybi/ 针对 bucket 是 zhangyibo 进行的操作,可以是 PUT / GET 等操作。
主账号 / RAM 子账号的 AccessKey 、Access Key Secret 获取方式如下



丑话说在前面



  • 我也是个客服,并非正规阿里云研发代码,仅个人分享。
  • 本次代码仅仅演示最简单的 OSS 上传操作,没有做过多的校验,请使用者自行判断提交信息的正确性。
  • 如果 “活” 儿不好,请客官们手指一二,下次改正缺点。

“被窝” 脚本如下



确实是在被窝里花了 30 分钟写出来的~,环境基础 2.7.5 来编写,如移植到各位客户机器上有异常,请看下对应的库文件,或者兼容性问题。
使用说明(都是必选):

PSA1#: python beiwo.py -h
Usage: beiwo.py [options]
Options:
  -h, --help  show this help message and exit
  -i AK       Must fill in Accesskey          访问云产品的 Accesskey
  -k SK       Must fill in AccessKeySecrety   访问云产品的 Accesskey Secret
  -e ED       Must fill in endpoint           OSS 的 endpoint 地理信息
  -b BK       Must fill in bucket             OSS bucket 
  -o OBJECTS  File name uploaded to oss       上传的 object 名称
  -f FI       Must fill localfile path        本地文件的名称 

趟坑

  • 客观想要玩的 安全,可以加个外套 Content-MD5,但是不注意的人就会忘记加了,补充如下:根据协议 RFC 1864 对消息内容(不包括头部)计算 MD5 值获得 128 比特位数字,对该数字进行 base64 编码为一个消息的 Content-MD5 值,并且 MD5 是 大写 哦。
  • 如果客观想要单独加项目 CanonicalizedOSSHeaders 一定要记得不仅在 Header 中加,你的 hmac 计算时也要加,来个板 “例”
  • Content-Type 一定要在 hmac 计算中
  • 如果遇到 client 计算的 MD5 和 Server 不一致的情况请直接使用 HTTPS 传输,很可能中间的网络设置有故障或者劫持时导致内存被篡改,只要将 url 改为 https:// 就是启动 HTTPS 协议 上传/ 下载 了。
hmac.new("5Lic5Lqs5LiA54K56YO95LiN54Ot","PUT\n\napplication/x-www-form-urlencoded\nSun, 02 Sep 2018 03:20:05 GMT\nx-oss-video:tokhot.avi/zhangyibo/tokhot.avi", sha)

脚本源码:

from optparse import OptionParser
import urllib,urllib2
import datetime
import base64
import hmac
import sha
import os
import sys
class Main():
  # Initial input parse
  def __init__(self,options):
    self.ak = options.ak
    self.sk = options.sk
    self.ed = options.ed
    self.bk = options.bk
    self.fi = options.fi
    self.oj = options.objects
    self.types = "application/x-www-form-urlencoded"   
    self.url = 'http://{0}.{1}/{2}'.format(self.bk,self.ed,self.oj)
  # Check client input parse
  def CheckParse(self):
    if (self.ak and self.sk and self.ed and self.bk and self.oj and self.fi) != None:
      if str(self.ak and self.sk and self.ed and self.bk and self.oj and self.fi):
        return True
    else:
      return False

  # GET local GMT time
  def GetGMT(self):
    GMT = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
    return GMT

  # GET Signature
  def GetSignature(self):
    mac = hmac.new("{0}".format(self.sk),"PUT\n\n{0}\n{1}\n/{2}/{3}".format(self.types,self.GetGMT(),self.bk,self.oj), sha)
    Signature = base64.b64encode(mac.digest())
  
    return Signature
  # PutObject
  def PutObject(self):
    try:
      with open(self.fi) as fd:
        files = fd.read()
    except Exception:
      sys.exit('\033[1;31;40m[error:]\033[0mFail to read localfile')

    try:
      request = urllib2.Request(self.url, files)
    except Exception:
      sys.exit('\033[1;31;40m[error:]\033[0mraise AttributeError, attr')
    try:
     request.add_header('Host','ali-beijing.oss-cn-beijing.aliyuncs.com')
     request.add_header('Date','{0}'.format(self.GetGMT()))
     request.add_header('Authorization','OSS {0}:{1}'.format(self.ak,self.GetSignature()))
     request.get_method = lambda:'PUT'
     response = urllib2.urlopen(request,timeout=10)
     sys.exit("\n%s"%response.headers)
    except Exception,e:
      sys.exit('\n\033[1;31;40m[error:]\033[0m%s'%e)
  
if __name__ == "__main__":
  parser = OptionParser()
  parser.add_option("-i",dest="ak",help="Must fill in Accesskey")
  parser.add_option("-k",dest="sk",help="Must fill in AccessKeySecrety")
  parser.add_option("-e",dest="ed",help="Must fill in endpoint")
  parser.add_option("-b",dest="bk",help="Must fill in bucket")
  parser.add_option("-o",dest="objects",help="File name uploadd to oss")
  parser.add_option("-f",dest="fi",help="Must fill localfile path")
  (options, args) = parser.parse_args()
  handler = Main(options)
  if handler.CheckParse():
    handler.PutObject()
  else:
    sys.exit('\033[1;31;40m[error:]\033[0mCheck your parse not null')

运行结果:

cae132fce8d1d4a3dec45938f71a94e6069229f9

85b6fdaca0c2bfef6581bcd3214b3c2e1c170f60

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
28天前
|
tengine 网络协议 API
阿里云DNS常见问题之DNS中alidns的api调用失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
1月前
|
Java API 开发工具
如何用阿里云 oss 下载文件
阿里云对象存储服务(OSS)提供了多种方式下载文件,以下讲解下各种方式的下载方法
885 1
|
1月前
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
175 2
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
1天前
|
网络协议 对象存储
阿里云oss配置自有域名
阿里云oss配置自有域名
9 1
|
3天前
|
存储 开发工具 对象存储
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
11 0
|
9天前
|
API
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
|
10天前
|
存储 Java API
阿里云oss简介和使用流程
本文档介绍了如何准备阿里云OSS(对象存储服务)并开始使用它。首先,需要注册阿里云账号并进行实名认证,然后购买OSS资源包。在阿里云控制台中,可以创建和管理OSS存储空间(称为“Bucket”)。接着,文章简要介绍了阿里云OSS,它是一个基于云端的对象存储服务,提供高可靠性、高性能、低成本和易于使用的特性。 在阿里云OSS控制台,用户可以进行文件的上传和下载操作。通过API,开发者可以使用各种编程语言(如Java)来创建、删除Bucket以及上传、下载和删除文件。例如,Java代码示例展示了如何创建Bucket、上传文件、删除文件以及下载文件到本地的操作。
|
17天前
|
开发工具 对象存储
阿里云OSS文件上传
阿里云OSS文件上传
59 0
|
17天前
|
存储 缓存 Java
阿里云OSS实战从入门到大神
说起阿里云OSS,那作用和功能都是非常强大的,它可以存放图片,音频,视频等资源文件,这些资源文件,你不必存放到服务器的硬盘里,这样既可以节省服务器硬盘空间,又可以降低服务器的读写压力,非常适合大并发的架构。
55 0