服务端加密

最近更新时间:2024-05-21 15:08:22

我的收藏

简介

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

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

由腾讯云 COS 托管主密钥和管理数据。COS 会帮助您在数据写入数据中心时自动加密,并在您取用该数据时自动解密。目前支持使用 COS 主密钥对数据进行 AES-256 加密。
// 初始化用户身份信息(secretId, secretKey)
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理 COSCredentials cred = new BasicCOSCredentials("SECRETID", "SECRETKEY"); // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224 ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou")); // 生成cos客户端 COSClient cosClient = new COSClient(cred, clientConfig);

String bucketName = "examplebucket-1250000000";
String key = "aaa/bbb.txt";
File localFile = new File("test.txt"); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile); ObjectMetadata objectMetadata = new ObjectMetadata(); // 设置加密算法为AES256 objectMetadata.setServerSideEncryption(SSEAlgorithm.AES256.getAlgorithm()); putObjectRequest.setMetadata(objectMetadata); try { PutObjectResult result = cosClient.putObject(putObjectRequest); System.out.println("finish upload, reqid:" + result.getRequestId()); } catch (CosServiceException cse) { cse.printStackTrace(); } catch (CosClientException cce) { cce.printStackTrace(); } finally {
cosClient.shutdown();
}

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

加密密钥由用户自己提供,用户在上传对象时,COS 将使用用户提供的加密密钥对用户的数据进行 AES-256 加密。
注意:
该加密所运行的服务需要使用 HTTPS 请求。
用户需要提供一个32字节的字符串作为密钥,支持数字、字母、字符的组合,不支持中文。
如果上传文件时设置了密钥加密,那么在使用 GET(下载)、HEAD(查询)源对象时也需要在请求中带上相同的密钥,才能正常响应。
// 初始化用户身份信息(secretId, secretKey)
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理 COSCredentials cred = new BasicCOSCredentials("SECRETID", "SECRETKEY"); // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224 ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou")); // 生成cos客户端 COSClient cosClient = new COSClient(cred, clientConfig);

String bucketName = "examplebucket-1250000000";
String key = "aaa/bbb.txt";
File localFile = new File("test.txt"); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);

String encodedKey = "0123456789ABCDEF0123456789ABCDEF"; SSECustomerKey sseCustomerKey = new SSECustomerKey(Base64.encodeAsString(encodedKey.getBytes())); putObjectRequest.setSSECustomerKey(sseCustomerKey); try { PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); // putobjectResult会返回文件的etag, 该md5值根据s3语义不是对象的md5,只是唯一性标志 String etag = putObjectResult.getETag(); System.out.println("finish upload, etag:" + etag); } catch (CosServiceException e) { e.printStackTrace(); } catch (CosClientException e) { e.printStackTrace(); } finally {
cosClient.shutdown();
}

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

SSE-KMS 加密即使用 KMS 托管密钥的服务端加密。KMS 是腾讯云推出的一款安全管理类服务,使用经过第三方认证的硬件安全模块 HSM(Hardware Security Module)来生成和保护密钥。它能够帮助用户轻松创建和管理密钥,满足用户多应用多业务的密钥管理需求以及满足监管和合规要求。关于如何开通 KMS 服务请参见 服务端加密概述
// 初始化用户身份信息(secretId, secretKey) // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理 COSCredentials cred = new BasicCOSCredentials("SECRETID", "SECRETKEY"); // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224 ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou")); // 生成cos客户端 COSClient cosClient = new COSClient(cred, clientConfig); String bucketName = "examplebucket-1250000000"; String key = "aaa/bbb.txt"; File localFile = new File("test.txt"); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);

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 { PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); String crc64 = putObjectResult.getCrc64Ecma(); System.out.println("finish upload, crc64:" + crc64); } catch (CosServiceException e) { e.printStackTrace(); } catch (CosClientException e) { e.printStackTrace(); } finally {
cosClient.shutdown();
}

相关示例

关于 SSE-COS 的完整示例,请前往 GitHub 查看。
关于 SSE-C 的完整示例,请前往 GitHub 查看。
关于 SSE-KMS 的完整示例,请前往 GitHub 查看。