对象存储手把手教五 | 数据存取与加密

一 简介

随着航海征程的推进,乔巴的背包是越来越鼓,也越来越大了。看着轻装上阵的伙伴们,它的内心是复杂的。

乔巴 OS :我也想找个地方储存一下我的背包,可是我又担心背包里面的内容,被人窃取了可怎么好?

针对乔巴的需求,QingStor 对象存储提供了一套完整的解决方案。既能满足你多种多样的数据存取的需求,同时,还能确保你的数据安全。

本文中用到的相关名词有:

名词 释义
密钥 用于解密加密数据
MD5 用于确保密钥传输完整一致的算法
客户端加密 在上传数据前完成加密
服务端加密 上传数据后,服务端对数据进行加密
对象 用户数据的统称
源对象 上传的原始对象
目标对象 拷贝或移动后的对象
SSL协议 确保网络通信安全及数据完整的协议

二 什么是加密

QingStor 对象存储提供怎样的方案,来消除乔巴的担忧呢?我们先来看看 存/取 数据的流程:

通过上图,我们可以知道,乔巴要将背包存起来,首先需要将背包运送到存储地点(QingStor 对象存储)。

当前已经有比较成熟的做法用来保障数据在传输过程中的安全,也就是通用的SSL协议,这里不做详细说明了。

除此之外,乔巴也可以给自己的背包加个锁,即:客户端加密。这部分操作,是由乔巴自发完成并监管的。这里也不做具体说明。

等背包运输到 QingStor 了,QingStor 再对背包进行加密,这个就是服务端的数据加密。

为了消除乔巴的担忧,QingStor 对象存储提供了一套完整的解决方案: SSL 协议 + 服务端数据加密。

具体怎么做的呢?下面我们来详细说一下整个的加密/解密过程吧。好期待哦!

2.1 加密过程

乔巴现在想把背包(数据)交由 QingStor 对象存储,那么整个过程如下:

  1. 乔巴在自己的背包上贴上密钥,根据密钥生成的 MD5 值,和加密算法等标签。并保留这些信息。
  2. 乔巴将贴有这些标签的背包,交给 QingStor 对象存储。
  3. QingStor 在收到乔巴提交的背包后,先取下密钥,计算出密钥的 MD5 值
  4. QingStor 取下乔巴背包上的 MD5 值,与计算出的 MD5 值进行比对,以确认密钥在提交过程中没有被修改。
  5. 如果 QingStor 发现 MD5 值不一致了,提醒乔巴,背包内容可能会被窃取,需重新对背包贴标签,并再次提交
  6. 如果 QingStor 发现MD5 值一致时,说明密钥没有被修改,背包提交过程中是安全的,这个时候从背包上取下加密算法,对背包里面的数据进行加密
  7. 为了确保背包里面的数据仅乔巴一个人可以获取,在加密完成后,QingStor 丢弃背包上的密钥,仅保留根据密钥计算出来的MD5值,用于取数据时的认证。

至此,乔巴就可以拿着加密信息离开了。

2.2 解密过程

一段时间后,乔巴要从 QingStor 取回背包了,那么整个过程又是怎样的呢?

  1. 乔巴提出取数据的申请,并在申请里面提交当时存储背包时的标签:密钥,根据密钥生成的 MD5 值,和加密算法给 QingStor
  2. QingStor 收到乔巴提交的申请后,先取下密钥,计算出 MD5 值
  3. QingStor 再取下乔巴取包申请上的 MD5 值,与计算出的 MD5 进行比对,以确认密钥在提交过程中没有被修改
  4. 若 QingStor 发现两个MD5值不一致,提醒乔巴,根据约定,你这个背包取不了,需重新回去找找密钥,再次提交申请啊
  5. 若 QingStor 发现两个 MD5 值一致,说明这个申请是合法的
  6. QingStor 用乔巴提交的密钥将背包数据进行数据
  7. QingStor 将解密后的背包返回给乔巴

至此,乔巴就可以拿到自己的原始背包了。

三 如何使用加密

乔巴:也就是说我只要保存好我的密钥就行了,是么?

QingStor:是的呢,密钥可要保存好哦,弄丢了,背包里面的东西就谁也不能获取到了,包括你自己哦。

乔巴:果然是够安全了。那我们就开始来办手续吧。

3.1 加密请求头

根据前文提到的,我们知道,需要给乔巴的背包贴上三个标签以实现对背包的加密。那么这个标签要怎么写呢?内容格式如下:

请求头 类型 描述
x-qs-encryption-customer-algorithm String 用户的指定加密算法
x-qs-encryption-customer-key String 用户提供的密钥
x-qs-encryption-customer-key-MD5 String 用户提供的密钥的 MD5

备注:

  • QingStor 对象存储目前支持的加密算法仅有 AES256。
  • QingStor 对象存储要求密钥的明文必须具有32个字节长度。且,密钥必须进行 Base64 编码处理
  • 为了确认密钥在传输过程中的完整性,这里也需要用户提供原始密钥的 MD5 值,且该 MD5 值也必须进行 Base64 编码处理。

标签贴好了,那么如何提交请求呢?QingStor 对象存储提供多种API,用以满足用户的多种请求类型。详细内容如下:

3.2 基础操作

3.2.1 GET Object

若乔巴想从指定的存储空间,获取之前存储的加密对象(背包),可以使用 GET Object,并携带该加密对象的加密信息。即:加密请求头。

具体可以这样做:

请求示例:

GET /myphoto.jpg HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 01:32:07 GMT
Authorization: authorization string
Connection: close
Content-Type: application/octet-stream
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: your key
X-Qs-Encryption-Customer-Key-Md5: md5 of your key

响应示例:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 21 Jul 2021 01:32:44 GMT
Last-Modified: Tue, 20 Jul 2021 10:29:28 GMT
Content-Type: application/octet-stream
Content-Length: 712012
Connection: keep-alive
ETag: "7c1fa24c1049ea04713e38a876531b3b"
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-raw-version-id: '596774173842344405
x-qs-request-id: 412b0b33cb5df691
x-qs-storage-class: STANDARD

[712012 bytes of object data]

3.2.2 PUT Object

若乔巴需要将待存储至指定空间的对象(背包)进行加密,可以使用 PUT Object,并携带加密信息。

具体可以这样做:

请求示例:

PUT /myphoto.jpg HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Tue, 20 Jul 2021 10:28:51 GMT
Content-Length: 7987
Authorization: authorization string
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: your key
X-Qs-Encryption-Customer-Key-Md5: md5 of your key

响应示例:

HTTP/1.1 201 CREATED
Server: nginx
Date: Tue, 20 Jul 2021 10:29:28 GMT
ETag: "7c1fa24c1049ea04713e38a876531b3b"
Content-Length: 0
Connection: close
X-Qs-Encryption-Customer-Algorithm: 'AES256'
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-request-id: c60578c617907748

3.2.3 PUT Object - Copy

若乔巴想要对已经存储在 QingStor 的加密对象(背包),进行备份,可以使用PUT Object - Copy ,对源对象(背包)进行拷贝。

拷贝后的对象,不会包含源对象的加密信息,乔巴需要再次提供加密信息,对目标对象进行加密。

由于拷贝的过程涉及到:

  1. 读取源对象
  2. 将源对象写入目标存储空间

根据前文说明,我们知道,若需读取 QingStor 的加密对象(背包),我们需要提供该加密对象的加密信息。成功读取后,再将该对象写入存储空间时,我们需要提供加密信息,对该对象进行加密。

整个过程,我们需要提供两个加密信息:源对象的加密信息与目标对象的加密信息。为了区分这两个加密信息,QingStor 对象存储用到如下请求头来标明源对象的加密信息:

请求头 类型 描述
x-qs-copy-source-encryption-customer-algorithm String 源对象加密算法
x-qs-copy-source-encryption-customer-key String 源对象的密钥
x-qs-copy-source-encryption-customer-key-md5 String 源对象的密钥的 MD5

请求示例:

PUT /myphoto.jpg HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 03:06:32 GMT
Content-Type: application/octet-stream
Authorization: authorization string
X-Qs-Copy-Source: /source-bucket/source-object
X-Qs-Copy-Source-Encryption-Customer-Algorithm: AES256
X-Qs-Copy-Source-Encryption-Customer-Key: original object key
X-Qs-Copy-Source-Encryption-Customer-Key-Md5:original object key's md5
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: new object key
X-Qs-Encryption-Customer-Key-Md5: new object key's md5

响应示例:

HTTP/1.1 201 CREATED
Server: nginx
Date: Wed, 21 Jul 2021 03:11:02 GMT
ETag: "7c1fa24c1049ea04713e38a876531b3b"
Content-Length: 0
Content-Type: text/plain
Connection: close
X-Qs-Encryption-Customer-Algorithm: 'AES256'
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-request-id: c60578c617907748

3.2.4 PUT Object - Move

若乔巴需要将自己已经提交储存的背包移动一下存储位置,比如从一个存储空间移动到另外一个存储空间,那可以通过 PUT Object - Move 来操作。

因为移动背包不涉及到背包数据的读写,因此该操作是无需提供加密背包时所使用的加密信息,即:无需提供源对象加密请求头。

移动后的背包(目标对象),仍然保留源背包(源对象)加密时所使用的加密信息。

请求示例:

PUT /myphoto.jpg HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 03:11:02 GMT
Authorization: authorization string
X-Qs-move-source: /source-bucket/source-object
X-Qs-Copy-Source-Encryption-Customer-Algorithm: AES256
X-Qs-Copy-Source-Encryption-Customer-Key: original object key
X-Qs-Copy-Source-Encryption-Customer-Key-Md5:original object key's md5
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: new object key
X-Qs-Encryption-Customer-Key-Md5: new object key's md5

响应示例:

HTTP/1.1 201 CREATED
Server: QingStor
Date: Wed, 21 Jul 2021 03:11:02 GMT
ETag: "0c2f573d81194064b129e940edcefe9b"
Content-Length: 0
Connection: close
X-Qs-Encryption-Customer-Algorithm: 'AES256'
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-request-id: c60578c617907748

3.2.5 HEAD Object

当乔巴存储的东西越来越多了,搞不清楚每个背包里有什么内容,这个时候可以使用 HEAD Object 来获取一下这些背包的相关信息。因为不涉及到背包数据的读写,因此该操作无需提供加密背包时所使用的加密信息,即:无需提供源对象的加密请求头。

若乔巴手里的密钥太多,不确定密钥与背包是否匹配,也可以使用HEAD Object 来操作,这个时候就需要提供背包加密时所使用的加密信息,即:需要提供源对象的加密请求头,用以验证该加密信息的算法与密钥是否正确。

请求示例:

HEAD /myphoto.jpg HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 06:13:33 GMT
Connection:close
Authorization: authorization string
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: your key
X-Qs-Encryption-Customer-Key-Md5:your key's md5

响应示例:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 21 Jul 2021 06:13:33 GMT
Last-Modified: Tue, 20 Jul 2021 10:29:28 GMT
ETag: "0c2f573d81194064b129e940edcefe9b"
Content-Type: application/octet-stream
Content-Length: 7987
Connection: keep-alive
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key-Md5: key's md5
x-qs-storage-class: STANDARD
x-qs-request-id: aa08cf7a43f611e5886952542e6ce14b

3.3 分段上传

若乔巴待存储的背包过大,如超过 5G,这个时候,乔巴需要将背包进行一下切分,分为多个小背包进行传输。待 QingStor 收到该背包的所有分片后,QingStor 会将这些分片进行组装,再次整理为一个背包进行存储。

具体做法,参考如下内容:

3.3.1 Initiate Multipart Upload

首先,乔巴需要通知 QingStor,它需要加密分段上传。这个时候,需要用到带有加密信息的 Initiate Multipart Upload 操作来完成。

请求示例:

POST /large-object?uploads HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 06:58:47 GMT
Authorization: authorization string
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: your key
X-Qs-Encryption-Customer-Key-Md5: your key's md5

响应示例:

HTTP/1.1 200 OK
Server: QingStor
Date: Wed, 21 Jul 2021 06:59:24 GMT
Content-Type: application/json
Content-Length: 90
Connection: keep-alive
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key-Md5: your key
x-qs-request-id: f697b777721f033e
x-qs-request-id: 37fed66c441a11e5b95f52542e6ce14b

{
    "bucket":"test-rose",
    "key":"example_key8",
    "upload_id":"84947437bc00e22"
}

备注:

  • 这个过程中,QingStor 仅保存密钥的MD5值,用于验证后续上传分段的密钥是否正确。
  • QingStor 将丢弃乔巴提交的密钥信息。

3.3.2 Upload Object Part

QingStor 收到乔巴加密分段上传的请求,并做好相关准备操作后,告诉乔巴,你可以继续上传分段了。这个时候,乔巴可以使用携带有加密信息的 Upload Object Part 来进行操作。

备注:

  • 由于是同一个背包(对象)的不同分片,故加密信息应与初始化分段时提供的加密信息保持一致。
  • 该操作需包含有初始化加密分段上传阶段的 upload_id 字段

请求示例:

PUT /large-object?upload_id=4d26b37a469230619604ecdc0e314782&part_number=0 HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 06:59:24 GMT
Content-Length: 7987
Authorization: authorization string
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: your key
X-Qs-Encryption-Customer-Key-Md5: your key's md5

响应示例:

HTTP/1.1 201 CREATED
Server: QingStor
Date: Wed, 21 Jul 2021 06:59:24 GMT
Content-Length: 0
Connection: close
X-Qs-Encryption-Customer-Algorithm: 'AES256'
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-request-id: 37fed66c441a11e5b95f52542e6ce14b

3.3.3 Copy Object Part

QingStor 也支持对加密分段的拷贝操作。与拷贝加密对象对象的操作相同,需要提供额外的请求头:

请求头 类型 描述
x-qs-copy-source-encryption-customer-algorithm String 源对象加密算法
x-qs-copy-source-encryption-customer-key String 源对象的密钥
x-qs-copy-source-encryption-customer-key-md5 String 源对象的密钥的 MD5

备注:

  • 拷贝时,提供的源对象加密信息与初始化分段时提供的加密信息保持一致。
  • 目标对象的加密信息重新给定。
  • 该操作需包含有初始化加密分段上传阶段的 upload_id 字段.

请求示例:

PUT /large-object?upload_id=4d26b37a469230619604ecdc0e314782&
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 03:06:32 GMT
Content-Type: application/octet-stream
Authorization: authorization string
X-Qs-Copy-Source: /source-bucket/source-object
X-Qs-Copy-Source-Encryption-Customer-Algorithm: AES256
X-Qs-Copy-Source-Encryption-Customer-Key: original object key
X-Qs-Copy-Source-Encryption-Customer-Key-Md5:original object key's md5
X-Qs-Encryption-Customer-Algorithm: AES256
X-Qs-Encryption-Customer-Key: new object key
X-Qs-Encryption-Customer-Key-Md5: new object key's md5

响应示例:

HTTP/1.1 201 CREATED
Server: QingStor
Date: Wed, 21 Jul 2021 03:11:02 GMT
ETag: "7c1fa24c1049ea04713e38a876531b3b"
Content-Length: 0
Content-Type: text/plain
Connection: close
X-Qs-Encryption-Customer-Algorithm: 'AES256'
X-Qs-Encryption-Customer-Key-Md5: md5 of your key
x-qs-request-id: c60578c617907748

3.3.4 Complete Multipart Upload

当乔巴的加密分段上传完成后,这个时候,就需要用到带有加密信息的 Initiate Multipart Upload 操作来通知 QingStor 加密分段上传完成。

备注:

  • 该操作不能单独使用。
  • 该操作不涉及到背包数据的读取,故无需提交加密请求头
  • 该操作需包含有初始化加密分段上传阶段的 upload_id 字段

请求示例:

POST /large-object?upload_id=4d26b37a469230619604ecdc0e314782 HTTP/1.1
Host: mybucket.<zone-id>.qingstor.com
Date: Wed, 21 Jul 2021 03:06:32 GMT
Authorization: authorization string
ETag: "0c2f573d81194064b129e940edcefe9b"
{
    "object_parts": [
        {"part_number": 0, "etag": "c837682353601f7fc0a2ccb6bc8f4654"},
        {"part_number": 1, "etag": "28e2c0c6574a1ef20ac41d16a012a7c1"}
    ]
}

响应示例:

HTTP/1.1 201 CREATED
Server: QingStor
Date: Wed, 21 Jul 2021 03:06:32 GMT
Content-Length: 0
Connection: close
x-qs-request-id: 37fed66c441a11e5b95f52542e6ce14b

3.3.5 Abort Multipart Upload

在加密分段上传的过程中,乔巴发现传错背包了,或者其他原因需要终止加密分段上传,可以在完成分段上传前,提前终止加密分段上传,这个时候,就可以使用 Abort Multipart Upload。使用该操作后,已经上传成功的分段也将从 QingStor 删除。

备注:

  • 该操作不能单独使用。
  • 该操作无需提交加密请求头
  • 该操作需包含有初始化加密分段上传阶段的 upload_id 字段

请求示例:

DELETE /large-object?upload_id=4d26b37a469230619604ecdc0e314782 HTTP/1.1
Host: mybucket.pek3a.qingstor.com
Date: Wed, 21 Jul 2021 03:06:32 GMT
Content-Length: 0
Authorization: authorization string

响应示例:

HTTP/1.1 204 NoContent
Server: QingStor
Date: Wed, 21 Jul 2021 03:06:32 GMT
Content-Length: 0
Connection: close
x-qs-request-id: 37fed66c441a11e5b95f52542e6ce14b

四 结尾

至此,我们知道,QingStor 在完成对乔巴提交的对象加密后,将丢弃乔巴提交的用于解密该对象的密钥。也就是说,一旦该对象加密存储后,只有拥有该密钥的人,才能对该对象进行下载解密。

就好比家里的保险柜钥匙丢了,你打电话给这个保险柜的生产厂家,如果厂家说他能帮你打开,那这恰恰说明这个保险柜不是那么的保险。所以从保险角度来说,厂家也没有备用钥匙的。

所以 QingStor 在这里提醒诸位,一定要保管好自己的密钥哦!

本文由博客一文多发平台 OpenWrite 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容