详情页标题前

腾讯云对象存储客户端加密

详情页1

简介

Go SDK 支持客户端加密,将文件加密后再进行上传,并在下载时进行解密,适用于存储敏感数据的客户。客户端加密只支持以下方式:
KMS 服务托管密钥:用户只需提供 KMS 服务的用户主密钥 ID(即 CMK ID)给 SDK。使用这种方式需要用户开通 KMS 服务,更多 KMS 服务信息参见
腾讯密钥管理系统

注意事项

在对加密数据进行复制或者迁移时,您需要对加密元信息的完整性和正确性负责。因您维护不当导致加密元信息出错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。

上传加密流程

每次上传一个文件对象前,将随机生成一个对称加密密钥。随机生成的密钥通过 KMS 服务进行加密,将加密后的结果 base64 编码存储在对象的元数据中。进行文件对象的上传,上传时在内存使用 AES256 算法加密。

下载解密流程

获取文件元数据中加密必要的信息,Base64 解码后使用 KMS 服务(或者用户提供的密钥)进行解密,得到当时加密数据的密钥。使用密钥对下载输入流进行使用 AES256 解密,得到解密后的文件输入流。

请求示例

完整的示例请参见 客户端加密 – KMS 加密完整示例

请求示例1:简单上传和下载

// 创建原始客户端u, _ := url.Parse("https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com")b := &cos.BaseURL{BucketURL: u}c := cos.NewClient(b, &http.Client{    Transport: &cos.AuthorizationTransport{        SecretID:  os.Getenv("SECRETID"),  // 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140        SecretKey: os.Getenv("SECRETKEY"),  // 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140    },})
// Case1 上传对象name := "test/example"
// 该标识信息唯一确认一个主加密密钥, 解密时,需要传入相同的标识信息// KMS加密时,该信息设置成 EncryptionContext,最大支持1024字符,如果 Encrypt 指定了该参数,则在 Decrypt 时需要提供同样的参数materialDesc := make(map[string]string)//materialDesc["desc"] = "material information of your master encrypt key"
// 创建 KMS 客户端kmsclient, _ := coscrypto.NewKMSClient(c.GetCredential(), "ap-guangzhou")// 创建 KMS 主加密密钥,标识信息 materialDesc 和主密钥一一对应kmsID := os.Getenv("KMSID")masterCipher, _ := coscrypto.CreateMasterKMS(kmsclient, kmsID, materialDesc)// 创建加密客户端client := coscrypto.NewCryptoClient(c, masterCipher)
contentLength := 1024*1024*10 + 1originData := make([]byte, contentLength)_, err := rand.Read(originData)f := bytes.NewReader(originData)// 加密上传_, err = client.Object.Put(context.Background(), name, f, nil)log_status(err)
// 解密下载resp, err := client.Object.Get(context.Background(), name, nil)log_status(err)defer resp.Body.Close()decryptedData, _ := ioutil.ReadAll(resp.Body)if bytes.Compare(decryptedData, originData[rangeStart:rangeEnd+1]) != 0 { fmt.Println("Error: encryptedData != originData")}

请求示例2:上传文件和下载对象到文件

// 创建原始客户端u, _ := url.Parse("https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com")b := &cos.BaseURL{BucketURL: u}c := cos.NewClient(b, &http.Client{    Transport: &cos.AuthorizationTransport{        SecretID:  os.Getenv("SECRETID"),  // 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140        SecretKey: os.Getenv("SECRETKEY"),  // 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140    },})
// Case1 上传对象name := "test/example"
// 该标识信息唯一确认一个主加密密钥, 解密时,需要传入相同的标识信息// KMS 加密时,该信息设置成 EncryptionContext,最大支持1024字符,如果 Encrypt 指定了该参数,则在 Decrypt 时需要提供同样的参数materialDesc := make(map[string]string)//materialDesc["desc"] = "material information of your master encrypt key"
// 创建KMS客户端kmsclient, _ := coscrypto.NewKMSClient(c.GetCredential(), "ap-guangzhou")// 创建 KMS 主加密密钥,标识信息 materialDesc 和主密钥一一对应kmsID := os.Getenv("KMSID")masterCipher, _ := coscrypto.CreateMasterKMS(kmsclient, kmsID, materialDesc)// 创建加密客户端client := coscrypto.NewCryptoClient(c, masterCipher)
// 加密上传_, err = client.Object.PutFromFile(context.Background(), name, filepath, nil)if err != nil { //ERROR}
// 解密下载_, err = client.Object.GetToFile(context.Background(), name, "./test.download", nil)if err != nil { //ERROR}

请求示例3:分块上传

// 创建原始客户端u, _ := url.Parse("https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com")b := &cos.BaseURL{BucketURL: u}c := cos.NewClient(b, &http.Client{    Transport: &cos.AuthorizationTransport{        SecretID:  os.Getenv("SECRETID"),  // 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140        SecretKey: os.Getenv("SECRETKEY"),  // 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140    },})
// Case1 上传对象name := "test/example"
// 该标识信息唯一确认一个主加密密钥, 解密时,需要传入相同的标识信息// KMS 加密时,该信息设置成 EncryptionContext,最大支持1024字符,如果 Encrypt 指定了该参数,则在 Decrypt 时需要提供同样的参数materialDesc := make(map[string]string)//materialDesc["desc"] = "material information of your master encrypt key"
// 创建 KMS 客户端kmsclient, _ := coscrypto.NewKMSClient(c.GetCredential(), "ap-guangzhou")// 创建 KMS 主加密密钥,标识信息 materialDesc 和主密钥一一对应kmsID := os.Getenv("KMSID")masterCipher, _ := coscrypto.CreateMasterKMS(kmsclient, kmsID, materialDesc)// 创建加密客户端client := coscrypto.NewCryptoClient(c, masterCipher)
filepath := "test"stat, err := os.Stat(filepath)if err !- nil { // ERROR}contentLength := stat.Size()
// 分块上传// 每个分块需要16字节对齐,且大于等于1MBpartSize := (contentLength / 16 / 3) * 16if partSize < int64(1024*1024) { partSize = int64(1024*1024)}cryptoCtx := coscrypto.CryptoContext{ DataSize: contentLength, // 每个分块需要16字节对齐 PartSize: partSize,}// 切分数据_, chunks, _, err := cos.SplitFileIntoChunks(filepath, cryptoCtx.PartSize)if err !- nil { // ERROR}
// init mulituploadv, _, err := client.Object.InitiateMultipartUpload(context.Background(), name, nil, &cryptoCtx)if err !- nil { // ERROR}
// part uploadoptcom := &cos.CompleteMultipartUploadOptions{}for _, chunk := range chunks { fd, err := os.Open(filepath) if err !- nil { // ERROR } opt := &cos.ObjectUploadPartOptions{ ContentLength: chunk.Size, } fd.Seek(chunk.OffSet, os.SEEK_SET) resp, err := client.Object.UploadPart(context.Background(), name, v.UploadID, chunk.Number, cos.LimitReadCloser(fd, chunk.Size), opt, &cryptoCtx) if err !- nil { // ERROR } optcom.Parts = append(optcom.Parts, cos.Object{ PartNumber: chunk.Number, ETag: resp.Header.Get("ETag"), })}// complete upload_, _, err = client.Object.CompleteMultipartUpload(context.Background(), name, v.UploadID, optcom)if err !- nil { // ERROR}
_, err = client.Object.GetToFile(context.Background(), name, "test.download", nil)if err !- nil { // ERROR}



对象存储官网1折活动,限时活动,即将结束,速速收藏
同尘科技腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/145590.html

(0)
上一篇 2023年12月9日
下一篇 2023年12月9日
详情页2

相关推荐

  • 腾讯云对象存储服务端加密

    简介 本文档提供关于如何使用在上传对象时开启服务端加密。服务端加密的密钥分为三种:COS 托管加密密钥KMS 托管加密密钥客户提供的加密密钥 SDK API 参考 SDK 所有接口的具体参数与方法说明,请参考 SDK API。 使用 COS 托管加密密钥的服务端加密(SSE-COS)保护数据 功能说明 由腾讯云 COS 托管主密钥和管理数据。COS 会帮助您…

    腾讯云 2023年12月9日
  • 阿里云日志服务SLS消费-计量计费日志-云淘科技

    使用云服务最大好处是按量付费,无需预留资源,因此各云产品都有计量计费需求。本文介绍一种基于日志服务按量计费方案,该方案每天处理千亿级计量日志,被众多云产品使用。 计量日志生成计费结果过程 计量日志记录了您所涉及计费的项目,后端计费模块根据计费项和规则进行运算,产生最后账单。例如如下原始访问日志记录了项目(Project)使用情况: microtime:145…

    阿里云日志服务SLS 2023年12月10日
  • 腾讯云对象存储生命周期

    简介 本文档提供关于生命周期的 API 概览以及 SDK 示例代码。 API 操作名 操作描述 PUT Bucket lifecycle 设置生命周期 设置存储桶生命周期管理的配置 GET Bucket lifecycle 查询生命周期 查询存储桶生命周期管理的配置 DELETE Bucket lifecycle 删除生命周期 删除存储桶生命周期管理的配置 …

    腾讯云 2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 腾讯云裸金属云服务器竞价实例购买和计费

    本文章主要介绍如何购买竞价实例以及竞价实例的计费规则 购买方式 请在购买竞价实例前,联系腾讯云客户经理开通内测资格和申请配额。 API 方式 创建黑石竞价实例 参数详情 参数名称 描述 ComputeType 即计算单元,请根据业务模型选择算力规格,计算单元类型概览请参见 竞价实例。 GoodsNum 即计算单元个数,请根据业务规模决策计算单元的需求量。例如…

    2023年12月9日
  • 阿里云日志服务SLS通过Unity Plugin接入数据-云淘科技

    本文介绍如何通过Unity Plugin将Unity平台的移动端游戏App的崩溃数据、应用数据接入到日志服务移动运维监控中。移动运维监控用于实时监控游戏崩溃、ANR等问题,并且支持智能分析,帮助您低成本、高效率地发现App中的各类隐患。 前提条件 已创建移动运维监控应用。具体操作,请参见添加应用。 步骤一:集成SDK 下载最新版本Unity Plugin。 …

    阿里云日志服务SLS 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。