云服务器内容精选

  • 初始化CryptoCipher OBS Java SDK提供两种加密套件。您可根据使用场景自行选择。 CtrRSACipherGenerator继承于CTRCipherGenerator,不需要提供数据密钥或初始值,只需要提供RSA公钥或RSA私钥,用以加密和解密随机生成的数据密钥。 CTRCipherGenerator仅需提供一个数据密钥,所有对象均使用该数据密钥进行加密。 表1 CtrRSACipherGenerator类型参数 参数名称 参数类型 是否必选 描述 privateKey PrivateKey 解密文件时必选(例如getObject) 参数解释: RSA私钥。 默认取值: 无 publicKey PublicKey 加密文件时必选(例如putObject) 参数解释: RSA公钥。 默认取值: 无 masterKeyInfo String 可选 参数解释: 密钥信息,该信息会存至对象的自定义元数据中, 帮助您区分不同密钥,需您自行维护 masterKeyInfo与 密钥的映射关系。 默认取值: 无 secureRandom SecureRandom 必选 参数解释: 安全随机数生成器,用于随机生成cryptoKeyBytes和cryptoIvBytes,请您根据业务需求选择设置。 默认取值: 无 needSha256 boolean 可选 参数解释: 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据。 说明: 为了节省内存开销,SDK 采用了流式计算的方法,这也就意味着,普通上传时需要读取并加密文件两次;在另外由于断点续传上传接口为分段上传接口的封装,在断点续传下,则需要读取并加密文件三次。 取值范围: true:设置need_sha256为true时,SDK会自动计算待上传对象的加密前sha256值与加密后的sha256值,并存至对象自定义元数据,同时也会在发送请求时将加密后的文件的sha256值置于请求头,服务端收到请求后会计算收到对象的sha256,如果sha256不一致会返回错误信息。 false:不计算校验加密后数据的sha256。 默认取值: false 表2 CTRCipherGenerator类型参数 参数名称 参数类型 是否必选 描述 masterKeyInfo String 可选 参数解释: 密钥信息,该信息会存至对象的自定义元数据中,帮助您区分不同cryptoKeyBytes,需您自行维护 masterKeyInfo与 cryptoKeyBytes的映射关系。 默认取值: 无 cryptoKeyBytes byte[] 必选 参数解释: 加密数据所使用的数据密钥。 约束限制: 长度必须为32 bytes。 默认取值: 无 cryptoIvBytes byte[] 可选 参数解释: 加密数据时所使用的初始值。 约束限制: 长度必须为16 bytes。 指定时,所有对象均使用该初始值加密;未指定时,SDK会为每个对象随机生成不同初始值。 默认取值: 无 secureRandom SecureRandom 必选 参数解释: 安全随机数生成器,用于在未设置cryptoKeyBytes或cryptoIvBytes时随机生成缺失的对应参数,请您根据业务需求设置。 默认取值: 无 needSha256 boolean 可选 参数解释: 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据。 说明: 为了节省内存开销,SDK 采用了流式计算的方法,这也就意味着,普通上传时需要读取并加密文件两次;在另外由于断点续传上传接口为分段上传接口的封装,在断点续传下,则需要读取并加密文件三次。 取值范围: true:设置need_sha256为true时,SDK会自动计算待上传对象的加密前sha256值与加密后的sha256值,并存至对象自定义元数据,同时也会在发送请求时将加密后的文件的sha256值置于请求头,服务端收到请求后会计算收到对象的sha256,如果sha256不一致会返回错误信息。 false:不计算校验加密后数据的sha256。 默认取值: false
  • 示例代码 这是CtrRSACipherGenerator的示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 import com.obs.services.ObsConfiguration; import com.obs.services.crypto.CTRCipherGenerator; import com.obs.services.crypto.CryptoObsClient; import com.obs.services.crypto.CtrRSACipherGenerator; import com.obs.services.exception.ObsException; import com.obs.services.model.GetObjectRequest; import com.obs.services.model.ObsObject; import com.obs.services.model.PutObjectResult; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; public class CtrRSACipherGeneratorDemo001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("AC CES S_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); CtrRSACipherGenerator ctrRSACipherGenerator = null; try { String examplePrivateKeyPath = "yourRSAPrivateKeyPath"; String examplePublicKeyPath = "yourRSAPublicKeyPath"; ObsConfiguration config = new ObsConfiguration(); PrivateKey privateKeyObj = CtrRSACipherGenerator.importPK CS 8PrivateKey(examplePrivateKeyPath); PublicKey publicKeyObj = CtrRSACipherGenerator.importPublicKey(examplePublicKeyPath); ctrRSACipherGenerator = new CtrRSACipherGenerator( "example_master_key_info", true, config.getSecureRandom(), privateKeyObj, publicKeyObj); } catch (IllegalArgumentException | IOException | NoSuchAlgorithmException | InvalidKeySpecException e) { e.printStackTrace(); } assert ctrRSACipherGenerator != null; // 创建ObsClient实例 try (CryptoObsClient cryptoObsClient = new CryptoObsClient(ak, sk, securityToken, endPoint, ctrRSACipherGenerator)) { String exampleBucketName = "example-bucket"; String exampleObjectKey = "exampleObjectKey"; String examplePlainTextFilePath = "examplePlainTextFilePath"; String exampleDecryptedFilePath = "exampleDecryptedFilePath"; PutObjectResult putObjectResult = cryptoObsClient.putObject(exampleBucketName, exampleObjectKey, new File(examplePlainTextFilePath)); System.out.println("HTTP Code: " + putObjectResult.getStatusCode()); System.out.println("Etag: " + putObjectResult.getEtag()); // 客户端加密上传成功 System.out.println("CtrRSACipherGeneratorDemo001 putObject successfully"); GetObjectRequest getObjectRequest = new GetObjectRequest(exampleBucketName, exampleObjectKey); ObsObject obsObject = cryptoObsClient.getObject(getObjectRequest); InputStream input = obsObject.getObjectContent(); byte[] b = new byte[1024]; FileOutputStream fileOutputStream = new FileOutputStream(exampleDecryptedFilePath); int len; while ((len = input.read(b)) != -1) { fileOutputStream.write(b, 0, len); } fileOutputStream.close(); input.close(); System.out.println("HTTP Code: " + obsObject.getMetadata().getStatusCode()); // 客户端解密下载成功 System.out.println("CtrRSACipherGeneratorDemo001 getObject successfully"); // 验证加密之前的文件和解密之后的文件是否一致 byte[] plainTextFileSha256 = CTRCipherGenerator.getFileSha256Bytes(examplePlainTextFilePath); byte[] decryptedFileSha256 = CTRCipherGenerator.getFileSha256Bytes(exampleDecryptedFilePath); String plainTextFileSha256Base64Encoded = CTRCipherGenerator.getBase64Info(plainTextFileSha256); String decryptedFileSha256Base64Encoded = CTRCipherGenerator.getBase64Info(decryptedFileSha256); System.out.println("plainTextFileSha256 base64 encoded: " + plainTextFileSha256Base64Encoded); System.out.println("decryptedFileSha256 base64 encoded: " + decryptedFileSha256Base64Encoded); System.out.println( "plainTextFileSha256 equals decryptedFileSha256 ? " + decryptedFileSha256Base64Encoded.equals(plainTextFileSha256Base64Encoded)); System.out.println("CtrRSACipherGeneratorDemo001 successfully"); } catch (ObsException e) { System.out.println("CtrRSACipherGeneratorDemo001 failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code: " + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message: " + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); } catch (Exception e) { System.out.println("CtrRSACipherGeneratorDemo001 putObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 上传加密段 上传加密段继承自普通 OBS Client 的上传段接口,详细参数可参考分段上传-上传段(Python SDK) 方法定义 CryptoClient.initiateEncryptedMultipartUpload(bucketName, objectKey, partNumber, uploadId, crypto_cipher, *args, **kwargs) 接口参数 表5 请求参数列表 参数名称 参数类型 是否必选 描述 bucketName str 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 objectKey str 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 说明: 对象链接地址格式为:https://桶名. 域名 /文件夹目录层级/对象名。如果该对象存在于桶的根目录下,则链接地址将不需要有文件夹目录层级。 partNumber int 必选 参数解释: 段号。 取值范围: [1,10000] 默认取值: 无 uploadId str 必选 参数解释: 分段上传任务的ID。任务ID可以通过初始化分段上传任务生成。例如:000001648453845DBB78F2340DD460D8。 约束限制: 长度为32的字符串。 默认取值: 无 crypto_cipher OBSCipher 必选 参数解释: 调用 cipher_generator.new() 方法所生成的 OBSCipher 取值范围: cipher_generator.new() ,cipher_generator为初始化时的cipher_generator参数。 示例:cipher = ctr_client.cipher_generator.new(""),ctr_client为加密客户端。 默认取值: 无
  • 初始化 CryptoCipher OBS Python SDK 提供两种 CryptoCipher。您可根据使用场景自行选择。 CtrRSACipherGenerator 需要提供一个 RSA 公钥或 RSA 私钥,用以加密随机生产的数据密钥。 方法定义 CtrRSACipherGenerator(master_crypto_key_path, master_key_info=None, need_sha256=False) 接口参数 表1 CtrRSACipherGenerator 参数名称 参数类型 是否必选 描述 master_crypto_key_path str 必选 参数解释: RSA 密钥文件的路径。 默认取值: 无 master_key_info str 可选 参数解释: 密钥信息,该信息会存至对象的自定义元数据中, 帮助您区分不同crypto_key,需您自行维护 master_key_info 与 crypto_key 的映射关系。 默认取值: 无 need_sha256 bool 可选 参数解释: 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据。 说明: 为了节省内存开销,SDK 采用了流式计算的方法,这也就意味着,普通上传时需要读取并加密文件两次;在另外由于断点续传上传接口为分段上传接口的封装,在断点续传下,则需要读取并加密文件三次。 取值范围: True:校验加密后数据的sha256,SDK自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值,并存至对象自定义元数据,同时也会在发送请求时置于请求头,服务端收到请求后会计算收到对象的 sha256,如果 sha256 不一致会返回错误信息。 False:不校验加密后数据的sha256。 默认取值: False CTRCipherGenerator 仅需提供一个数据密钥,所有对象均使用该数据密钥进行加密。 方法定义 CTRCipherGenerator(crypto_key, master_key_info=None, crypto_iv=None, need_sha256=False) 接口参数 表2 CTRCipherGenerator 参数名称 参数类型 是否必选 描述 crypto_key str or bytes 必选 参数解释: 加密数据所使用的数据密钥。 约束限制: 长度为 32 bytes。 如果传入的是字符串也会被转换为bytes。 默认取值: 无 master_key_info str 可选 参数解释: 密钥信息,该信息会存至对象的自定义元数据中, 帮助您区分不同crypto_key,需您自行维护 master_key_info 与 crypto_key 的映射关系。 默认取值: 无 crypto_iv str or bytes 可选 参数解释: 加密数据时所使用的初始值。 约束限制: 长度为 16 bytes。 指定crypto_iv时,所有对象均使用该初始值加密;未指定crypto_iv时,SDK会为每个对象随机生成不同初始值。 默认取值: 无 need_sha256 bool 可选 参数解释: 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据。 说明: 为了节省内存开销,SDK 采用了流式计算的方法,这也就意味着,普通上传时需要读取并加密文件两次;在另外由于断点续传上传接口为分段上传接口的封装,在断点续传下,则需要读取并加密文件三次。 取值范围: True:校验加密后数据的sha256,SDK自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值,并存至对象自定义元数据,同时也会在发送请求时置于请求头,服务端收到请求后会计算收到对象的 sha256,如果 sha256 不一致会返回错误信息。 False:不校验加密后数据的sha256。 默认取值: False
  • 加密过程与加密套件 OBS Java SDK提供了两个不同的加密套件生成器,分别是基于AES-CTR加密方法的CTRCipherGenerator与基于RSA + AES-CTR加密的CtrRSACipherGenerator。 使用CTRCipherGenerator上传对象时,用户需要提供一个用来加密数据的数据密钥,SDK将会针对每个对象随机生成一个初始值,并使用数据密钥与初始值加密对象,加密完成后将加密后文件上传至OBS,并将对应的初始值存储至对象元数据中。下载该对象时,用户需要提供对应的数据密钥,SDK会自动获取保存在对象元数据中的初始值,使用数据密钥与初始值解密对象并返回。下载时如若提供了与加密时不同的数据密钥,SDK也将返回不可用的解密后文件。 使用CtrRSACipherGenerator上传对象时,用户需要提供一个RSA 公钥,SDK会针对每个对象随机生成一个数据密钥和初始值,并使用数据密钥与初始值加密对象,加密完成后将加密后文件上传至OBS,随后会使用RSA密钥加密数据密钥,并将加密后的数据密钥与初始值存储至对象元数据中。下载该对象时,用户需要提供对应的RSA私钥,SDK会自动获取保存在对象元数据中的数据密钥与初始值,并使用私钥解密数据密钥,如若提供的私钥与上传时使用的密钥不匹配,将会抛出异常。解密成功后,SDK将会使用解密后的数据密钥与初始值解密对象并返回。
  • 元数据中的解密信息 SDK会将解密所需的必要信息存至对象的对象自定义元数据,并且不会有其他备份,如若您对这些数据进行了修改,将会造成数据无法解密,需要保存的信息及其含义如下表: 表2 参数名称 是否可选 描述 encrypted-algorithm 必选 加密套件的信息。 encrypted-object-key 必选(使用RSA加密套件时) 使用RSA密钥加密后的数据密钥。 encrypted-start 必选 加密该对象所使用的初始值经Base64编码后的字符串。 master-key-info 可选 加密密钥的信息。 plaintext-sha256 可选 加密前对象的sha256,流式上传不计算sha256。 plaintext-content-length 可选 加密前对象的长度,流对象在上传之前无法获取长度。 encrypted-sha256 可选 加密后对象的sha256,流式上传不计算sha256。
  • 加密过程与加密套件 OBS Java SDK 提供了两个不同的加密套件生成器,分别是基于 AES-CTR 加密方法的 CTRCipherGenerator 与基于 RSA + AES-CTR 加密的 CtrRSACipherGenerator。 使用 CTRCipherGenerator 上传对象时,用户需要提供一个用来加密数据的数据密钥,SDK 将会针对每个对象随机生成一个初始值,并使用数据密钥与初始值加密对象,加密完成后将加密后文件上传至 OBS,并将对应的初始值存储至对象元数据中。下载该对象时,用户需要提供对应的数据密钥,SDK 会自动获取保存在对象元数据中的初始值,使用数据密钥与初始值解密对象并返回。下载时如若提供了与加密时不同的数据密钥,SDK 也将返回不可用的解密后文件。 使用 CtrRSACipherGenerator 上传对象时,用户需要提供一个 RSA 公钥,SDK 会针对每个对象随机生成一个数据密钥和初始值,并使用数据密钥与初始值加密对象,加密完成后将加密后文件上传至 OBS,随后会使用 RSA 密钥加密数据密钥,并将加密后的数据密钥与初始值存储至对象元数据中。下载该对象时,用户需要提供对应的 RSA 私钥,SDK 会自动获取保存在对象元数据中的数据密钥与初始值,并使用私钥解密数据密钥,如若提供的私钥与上传时使用的密钥不匹配,将会抛出异常。解密成功后,SDK 将会使用解密后的数据密钥与初始值解密对象并返回。
  • 元数据中的解密信息 SDK 会将解密所需的必要信息存至对象的对象自定义元数据,并且不会有其他备份,如若您对这些数据进行了修改,将会造成数据无法解密,需要保存的信息及其含义如下表: 表2 参数名 约束 说明 encrypted-algorithm 必选 加密套件的信息 encrypted-object-key 必选(使用 RSA 加密套件时) 使用 RSA 密钥加密后的数据密钥 encrypted-start 必选 加密该对象所使用的初始值经 Base64 编码后的字符串 master-key-info 可选 加密密钥的信息 plaintext-sha256 可选 加密前对象的 sha256,流式上传不计算sha256 plaintext-content-length 可选 加密前对象的长度,流对象在上传之前无法获取长度 encrypted-sha256 可选 加密后对象的 sha256,流式上传不计算sha256
  • 初始化 CryptoCipher OBS Java SDK 提供两种 加密套件。您可根据使用场景自行选择。 CtrRSACipherGenerator 继承于CTRCipherGenerator,不需要提供数据密钥或初始值,只需要提供 RSA 公钥或RSA 私钥,用以加密和解密随机生成的数据密钥。 表1 CtrRSACipherGenerator 类型参数 参数名 类型 约束 说明 privateKey PrivateKey 解密文件时必选(例如getObject) RSA 私钥。 publicKey PublicKey 加密文件时必选(例如putObject) RSA 公钥。 masterKeyInfo String 可选 密钥信息,该信息会存至对象的自定义元数据中, 帮助您区分不同密钥,需您自行维护 masterKeyInfo与 密钥的映射关系. secureRandom SecureRandom 必选 安全随机数生成器,用于随机生成cryptoKeyBytes和cryptoIvBytes,请您根据业务需求选择设置 needSha256 boolean 可选 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据. 说明: 设置 need_sha256 为 True 时,SDK 会自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值,并存至对象自定义元数据,同时也会在发送请求时将加密后的文件的 sha256 值置于请求头,服务端收到请求后会计算收到对象的sha256,如若 sha256 不一致会返回错误信息。 为了节省内存开销,SDK 采用了流式计算sha256的方法,这也就意味着,普通上传时需要读取并加密文件两次;另外由于InputStream流无法重复读取,流式上传不支持计算sha256。 CTRCipherGenerator 仅需提供一个数据密钥,所有对象均使用该数据密钥进行加密。 表2 CTRCipherGenerator 类型参数 参数名 类型 约束 说明 masterKeyInfo String 可选 密钥信息,该信息会存至对象的自定义元数据中, 帮助您区分不同cryptoKeyBytes,需您自行维护 masterKeyInfo与 cryptoKeyBytes的映射关系. cryptoKeyBytes byte[] 必选 加密数据所使用的数据密钥,长度必须为 32 bytes. cryptoIvBytes byte[] 可选 加密数据时所使用的初始值,长度必须为 16 bytes,指定时,所有对象均使用该初始值加密;未指定时,SDK 会为每个对象随机生成不同 初始值. secureRandom SecureRandom 必选 安全随机数生成器,用于在未设置cryptoKeyBytes或cryptoIvBytes时随机生成缺失的对应参数,请您根据业务需求设置 needSha256 boolean 可选 是否校验加密后数据的sha256,并设置加密前后的sha256作为自定义元数据. 说明: 设置 need_sha256 为 True 时,SDK 会自动计算待上传对象的加密前 sha256 值与加密后的 sha256 值,并存至对象自定义元数据,同时也会在发送请求时将加密后的文件的 sha256 值置于请求头,服务端收到请求后会计算收到对象的sha256,如若 sha256 不一致会返回错误信息。 为了节省内存开销,SDK 采用了流式计算sha256的方法,这也就意味着,普通上传时需要读取并加密文件两次;另外由于InputStream流无法重复读取,流式上传不支持计算sha256。
  • 示例代码 这是CtrRSACipherGenerator的示例代码 import com.obs.services.ObsConfiguration; import com.obs.services.crypto.CTRCipherGenerator; import com.obs.services.crypto.CryptoObsClient; import com.obs.services.crypto.CtrRSACipherGenerator; import com.obs.services.exception.ObsException; import com.obs.services.model.GetObjectRequest; import com.obs.services.model.ObsObject; import com.obs.services.model.PutObjectResult; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; public class CtrRSACipherGeneratorDemo001 { public static void main(String[] args) { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 // String endPoint = System.getenv("ENDPOINT"); String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; CtrRSACipherGenerator ctrRSACipherGenerator = null; try { String examplePrivateKeyPath = "yourRSAPrivateKeyPath"; String examplePublicKeyPath = "yourRSAPublicKeyPath"; ObsConfiguration config = new ObsConfiguration(); PrivateKey privateKeyObj = CtrRSACipherGenerator.importPKCS8PrivateKey(examplePrivateKeyPath); PublicKey publicKeyObj = CtrRSACipherGenerator.importPublicKey(examplePublicKeyPath); ctrRSACipherGenerator = new CtrRSACipherGenerator( "example_master_key_info", true, config.getSecureRandom(), privateKeyObj, publicKeyObj); } catch (IllegalArgumentException | IOException | NoSuchAlgorithmException | InvalidKeySpecException e) { e.printStackTrace(); } assert ctrRSACipherGenerator != null; // 创建ObsClient实例 try (CryptoObsClient cryptoObsClient = new CryptoObsClient(ak, sk, securityToken, endPoint, ctrRSACipherGenerator)) { String exampleBucketName = "example-bucket"; String exampleObjectKey = "exampleObjectKey"; String examplePlainTextFilePath = "examplePlainTextFilePath"; String exampleDecryptedFilePath = "exampleDecryptedFilePath"; PutObjectResult putObjectResult = cryptoObsClient.putObject(exampleBucketName, exampleObjectKey, new File(examplePlainTextFilePath)); System.out.println("HTTP Code: " + putObjectResult.getStatusCode()); System.out.println("Etag: " + putObjectResult.getEtag()); // 客户端加密上传成功 System.out.println("CtrRSACipherGeneratorDemo001 putObject successfully"); GetObjectRequest getObjectRequest = new GetObjectRequest(exampleBucketName, exampleObjectKey); ObsObject obsObject = cryptoObsClient.getObject(getObjectRequest); InputStream input = obsObject.getObjectContent(); byte[] b = new byte[1024]; FileOutputStream fileOutputStream = new FileOutputStream(exampleDecryptedFilePath); int len; while ((len = input.read(b)) != -1) { fileOutputStream.write(b, 0, len); } fileOutputStream.close(); input.close(); System.out.println("HTTP Code: " + obsObject.getMetadata().getStatusCode()); // 客户端解密下载成功 System.out.println("CtrRSACipherGeneratorDemo001 getObject successfully"); // 验证一下,加密之前的文件和解密之后的文件是否一致 byte[] plainTextFileSha256 = CTRCipherGenerator.getFileSha256Bytes(examplePlainTextFilePath); byte[] decryptedFileSha256 = CTRCipherGenerator.getFileSha256Bytes(exampleDecryptedFilePath); String plainTextFileSha256Base64Encoded = CTRCipherGenerator.getBase64Info(plainTextFileSha256); String decryptedFileSha256Base64Encoded = CTRCipherGenerator.getBase64Info(decryptedFileSha256); System.out.println("plainTextFileSha256 base64 encoded: " + plainTextFileSha256Base64Encoded); System.out.println("decryptedFileSha256 base64 encoded: " + decryptedFileSha256Base64Encoded); System.out.println( "plainTextFileSha256 equals decryptedFileSha256 ? " + decryptedFileSha256Base64Encoded.equals(plainTextFileSha256Base64Encoded)); System.out.println("CtrRSACipherGeneratorDemo001 successfully"); } catch (ObsException e) { System.out.println("CtrRSACipherGeneratorDemo001 failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code: " + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message: " + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); } catch (Exception e) { System.out.println("CtrRSACipherGeneratorDemo001 putObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }