一 简介
随着航海征程的推动,乔巴的背包是越来越鼓,也越来越大了。看着轻装上阵的搭档们,它的心田是简单的。
乔巴 OS:我也想找个中央贮存一下我的背包,可是我又放心背包外面的内容,被人窃取了可怎么好?
针对乔巴的需要,QingStor 对象存储提供了一套残缺的解决方案。既能满足你多种多样的数据存取的需要,同时,还能确保你的数据安全。
本文中用到的相干名词有:
名词 | 释义 |
---|---|
密钥 | 用于解密加密数据 |
MD5 | 用于确保密钥传输残缺统一的算法 |
客户端加密 | 在上传数据前实现加密 |
服务端加密 | 上传数据后,服务端对数据进行加密 |
对象 | 用户数据的统称 |
源对象 | 上传的原始对象 |
指标对象 | 拷贝或挪动后的对象 |
SSL 协定 | 确保网络通信平安及数据残缺的协定 |
二 什么是加密
QingStor 对象存储提供怎么的计划,来打消乔巴的担心呢?咱们先来看看 存 / 取 数据的流程:
通过上图,咱们能够晓得,乔巴要将背包存起来,首先须要将背包运送到存储地点(QingStor 对象存储)。
以后曾经有比拟成熟的做法用来保障数据在传输过程中的平安,也就是通用的 SSL 协定,这里不做具体阐明了。
除此之外,乔巴也能够给本人的背包加个锁,即:客户端加密。这部分操作,是由乔巴自发实现并监管的。这里也不做具体阐明。
等背包运输到 QingStor 了,QingStor 再对背包进行加密,这个就是服务端的数据加密。
为了打消乔巴的担心,QingStor 对象存储提供了一套残缺的解决方案:SSL 协定 + 服务端数据加密。
具体怎么做的呢?上面咱们来具体说一下整个的加密 / 解密过程吧。好期待哦!
2.1 加密过程
乔巴当初想把背包(数据)交由 QingStor 对象存储,那么整个过程如下:
- 乔巴在本人的背包上贴上密钥,依据密钥生成的 MD5 值,和加密算法等标签。并保留这些信息。
- 乔巴将贴有这些标签的背包,交给 QingStor 对象存储。
- QingStor 在收到乔巴提交的背包后,先取下密钥,计算出密钥的 MD5 值
- QingStor 取下乔巴背包上的 MD5 值,与计算出的 MD5 值进行比对,以确认密钥在提交过程中没有被批改。
- 如果 QingStor 发现 MD5 值不统一了,揭示乔巴,背包内容可能会被窃取,需从新对背包贴标签,并再次提交
- 如果 QingStor 发现 MD5 值统一时,阐明密钥没有被批改,背包提交过程中是平安的,这个时候从背包上取下加密算法,对背包外面的数据进行加密
- 为了确保背包外面的数据仅乔巴一个人能够获取,在加密实现后,QingStor 抛弃背包上的密钥,仅保留依据密钥计算出来的 MD5 值,用于取数据时的认证。
至此,乔巴就能够拿着加密信息来到了。
2.2 解密过程
一段时间后,乔巴要从 QingStor 取回背包了,那么整个过程又是怎么的呢?
- 乔巴提出取数据的申请,并在申请外面提交过后存储背包时的标签:密钥,依据密钥生成的 MD5 值,和加密算法给 QingStor
- QingStor 收到乔巴提交的申请后,先取下密钥,计算出 MD5 值
- QingStor 再取下乔巴取包申请上的 MD5 值,与计算出的 MD5 进行比对,以确认密钥在提交过程中没有被批改
- 若 QingStor 发现两个 MD5 值不统一,揭示乔巴,依据约定,你这个背包取不了,需从新回去找找密钥,再次提交申请啊
- 若 QingStor 发现两个 MD5 值统一,阐明这个申请是非法的
- QingStor 用乔巴提交的密钥将背包数据进行数据
- 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,对源对象(背包)进行拷贝。
拷贝后的对象,不会蕴含源对象的加密信息,乔巴须要再次提供加密信息,对指标对象进行加密。
因为拷贝的过程波及到:
- 读取源对象
- 将源对象写入指标存储空间
依据前文阐明,咱们晓得,若需读取 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 公布!