tencent cloud

文档反馈

服务端加密

最后更新时间:2022-03-04 09:50:47

    简介

    本文档提供关于如何使用在上传对象时开启服务端加密。服务端加密的密钥分为三种:

    • COS 托管加密密钥
    • 客户提供的加密密钥
    • KMS 托管加密密钥

    使用 COS 托管加密密钥的服务端加密(SSE-COS)保护数据

    由腾讯云 COS 托管主密钥和管理数据。COS 会帮助您在数据写入数据中心时自动加密,并在您取用该数据时自动解密。目前支持使用 COS 主密钥对数据进行 AES-256 加密。

    // 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建
    // 详细代码参见上传对象:高级接口 -> 示例代码:创建 TransferManager
    TransferManager transferManager = createTransferManager();
    // 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
    String bucketName = "examplebucket-1250000000";
    // 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://www.tencentcloud.com/document/product/436/13324)
    String key = "exampleobject";
    // 本地文件路径
    String localFilePath = "/path/to/localFile";
    File localFile = new File(localFilePath);
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
    ObjectMetadata objectMetadata = new ObjectMetadata();
    // 设置加密算法为AES256
    objectMetadata.setServerSideEncryption(SSEAlgorithm.AES256.getAlgorithm());
    putObjectRequest.setMetadata(objectMetadata);
    // 服务端加密场景下,返回的etag不再代表文件的md5,所以需要去掉客户端的md5校验
    // 如有需要,可获取crc64,自行校验
    System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true");
    try {
      // 高级接口会返回一个异步结果Upload
      // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
      Upload upload = transferManager.upload(putObjectRequest);
      UploadResult uploadResult = upload.waitForUploadResult();
    } catch (CosServiceException e) {
      e.printStackTrace();
    } catch (CosClientException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    // 确定本进程不再使用 transferManager 实例之后,关闭之
    // 详细代码参见本页:高级接口 -> 关闭 TransferManager
    shutdownTransferManager(transferManager);
    

    使用客户提供的加密密钥的服务端加密 (SSE-C)保护数据

    加密密钥由用户自己提供,用户在上传对象时,COS 将使用用户提供的加密密钥对用户的数据进行 AES-256 加密。

    注意:

    • 该加密所运行的服务需要使用 HTTPS 请求。
    • 用户需要提供一个32字节的字符串作为密钥,支持数字、字母、字符的组合,不支持中文。
    • 如果上传文件时设置了密钥加密,那么在使用 GET(下载)、HEAD(查询)源对象时也需要在请求中带上相同的密钥,才能正常响应。
    // 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建
    // 详细代码参见上传对象:高级接口 -> 示例代码:创建 TransferManager
    TransferManager transferManager = createTransferManager();
    // 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
    String bucketName = "examplebucket-1250000000";
    // 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://www.tencentcloud.com/document/product/436/13324)
    String key = "exampleobject";
    // 本地文件路径
    String localFilePath = "/path/to/localFile";
    File localFile = new File(localFilePath);
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
    String base64EncodedKey = "MDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUY=";
    // sseCustomerKey是base64编码的密钥
    SSECustomerKey sseCustomerKey = new SSECustomerKey(base64EncodedKey);
    putObjectRequest.setSSECustomerKey(sseCustomerKey);
    // 服务端加密场景下,返回的etag不再代表文件的md5,所以需要去掉客户端的md5校验
    // 如有需要,可获取crc64,自行校验
    System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true");
    try {
      // 高级接口会返回一个异步结果Upload
      // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
      Upload upload = transferManager.upload(putObjectRequest);
      UploadResult uploadResult = upload.waitForUploadResult();
    } catch (CosServiceException e) {
      e.printStackTrace();
    } catch (CosClientException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    // 确定本进程不再使用 transferManager 实例之后,关闭之
    // 详细代码参见本页:高级接口 -> 关闭 TransferManager
    shutdownTransferManager(transferManager);
    

    使用 KMS 托管加密密钥的服务端加密(SSE-KMS)保护数据

    SSE-KMS 加密即使用 KMS 托管密钥的服务端加密。KMS 是腾讯云推出的一款安全管理类服务,使用经过第三方认证的硬件安全模块 HSM(Hardware Security Module)来生成和保护密钥。它能够帮助用户轻松创建和管理密钥,满足用户多应用多业务的密钥管理需求以及满足监管和合规要求。关于如何开通 KMS 服务请参考:服务端加密概述

    // 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建
    // 详细代码参见上传对象:高级接口 -> 示例代码:创建 TransferManager
    TransferManager transferManager = createTransferManager();
    // 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
    String bucketName = "examplebucket-1250000000";
    // 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://www.tencentcloud.com/document/product/436/13324)
    String key = "exampleobject";
    // 本地文件路径
    String localFilePath = "/path/to/localFile";
    File localFile = new File(localFilePath);
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
    // KMS 的主密钥
    String kmsKeyId = "your-kms-key-id";
    String encryptionContext = Base64.encodeAsString("{\"Ssekmstest\":\"Ssekmstest\"}".getBytes());
    SSECOSKeyManagementParams ssecosKeyManagementParams = new SSECOSKeyManagementParams(kmsKeyId, encryptionContext);
    putObjectRequest.setSSECOSKeyManagementParams(ssecosKeyManagementParams);
    // 服务端加密场景下,返回的etag不再代表文件的md5,所以需要去掉客户端的md5校验
    // 如有需要,可获取crc64,自行校验
    System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true");
    try {
      // 高级接口会返回一个异步结果Upload
      // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
      Upload upload = transferManager.upload(putObjectRequest);
      UploadResult uploadResult = upload.waitForUploadResult();
    } catch (CosServiceException e) {
      e.printStackTrace();
    } catch (CosClientException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    // 确定本进程不再使用 transferManager 实例之后,关闭之
    // 详细代码参见本页:高级接口 -> 关闭 TransferManager
    shutdownTransferManager(transferManager);
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持