文档中心 > 客户端数据加密
客户端数据加密

最近更新时间:2022-07-25

客户端加密是指将数据发送到UOS之前在用户本地进行加密。 加解密的整个过程称为“信封加密”。AmazonS3EncryptionClient生成一次性使用的AES 256位对称密钥(信封对称密钥)来加密您的数据,然后该密钥由您提供的主加密密钥加密并与您的数据一起存储在S3中。使用S3加密客户端访问您的数据时,将使用您提供的主加密密钥检索和解密加密的对称密钥,然后解密数据。您的主加密密钥可以是对称或非对称密钥。

免责声明

使用客户端加密功能时,您需要对主密钥的完整性和正确性负责。因您维护不当导致主密钥用错或丢失,从而导致加密数据无法解密所引起的一切损失和后果均由您自行承担。

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

使用前设置环境

安装S3客户端加密依赖包:

dotnet add package Amazon.Extensions.S3.Encryption

代码示例

加密的对称密钥存储在指令文件中,指令文件存储在与对象相同的位置:

using Amazon.S3.Model;

using Amazon.Extensions.S3.Encryption;
using System.Security.Cryptography;
using Amazon.Extensions.S3.Encryption.Primitives;

class Program
{
   static async Task Main(string[] args)
  {
       var putObjectResponse = await CreateAndRetrieveObjectAsync();
       Console.WriteLine("Get " + putObjectResponse.HttpStatusCode);
       Stream stream = putObjectResponse.ResponseStream;
       StreamReader reader = new StreamReader(stream);
       Console.WriteLine(reader.ReadToEnd());
  }

   // Method to create and encrypt an object in an S3 bucket
   static async Task<GetObjectResponse> CreateAndRetrieveObjectAsync()
  {
       // 初始化用户身份信息
       var ak = "yourAccessKeyId";
       var sk = "yourAccessKeySecret";
       // endpoint 以华北2-北京节点为例
       var endpoint = "https://oss-cn-north-2.unicloudsrv.com";
       var bucketName = "yourBucketName";
       var key = "yourKeyName";
       var config = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy)
      {
           ServiceURL = endpoint,
           StorageMode = CryptoStorageMode.InstructionFile
      };
       Aes aesAlgorithm = Aes.Create();
       // 请妥善保管好密钥
       File.WriteAllBytes(@"d:tempSymmetricKey.txt", aesAlgorithm.Key);
       EncryptionMaterialsV2 materials = new EncryptionMaterialsV2(aesAlgorithm, SymmetricAlgorithmType.AesGcm);
       var s3EncClient = new AmazonS3EncryptionClientV2(ak, sk, config, materials);

       // 上传一个加密对象
       await s3EncClient.PutObjectAsync(new PutObjectRequest
      {
           BucketName = bucketName,
           Key = key,
           ContentBody = "Secret Message"
      });

       // 下载一个对象并解密
       return await s3EncClient.GetObjectAsync(new GetObjectRequest
      {
           BucketName = bucketName,
           Key = key
      });
  }

}

其他

如果您的主加密密钥丢失,您将无法解密您的数据。您的主加密密钥永远不会发送到UOS;因此,您必须安全地存储它们(例如,作为文件或使用单独的密钥管理系统)并在需要上传或下载对象时加载它们。

以下示例显示了如何将主加密密钥与非对称算法一起使用。

  • 创建RSA算法的实例并将私钥保存在文件中:

  • RSA rsaAlgorithm = RSA.Create();

    string privateKey = rsaAlgorithm.ToXmlString(true);
    string filePath = @"c:tempPrivateKey.txt";
    File.WriteAllText(filePath, privateKey);
    EncryptionMaterials materials = new EncryptionMaterials(rsaAlgorithm);
    AmazonS3EncryptionClient client = new AmazonS3EncryptionClient(materials);
    // Perform your operations, such as PutObject, GetObject, etc.

  • 创建一个RSA算法的实例并使用保存的私钥加载它:

  • string filePath = @"c:tempPrivateKey.txt";

    string privateKey = File.ReadAllText(filePath);
    RSA rsaAlgorithm = RSA.Create();
    rsaAlgorithm.FromXmlString(privateKey);
    EncryptionMaterials materials = new EncryptionMaterials(rsaAlgorithm);
    AmazonS3EncryptionClient client = new AmazonS3EncryptionClient(materials);
    // Perform your operations, such as PutObject, GetObject, etc.

以下示例显示了如何将主加密密钥与对称算法一起使用。

  • 创建AES算法的实例并将对称密钥保存在文件中:

  • Aes aesAlgorithm = Aes.Create();

    File.WriteAllBytes(@"c:tempSymmetricKey.txt", aesAlgorithm.Key);
    EncryptionMaterials materials = new EncryptionMaterials(aesAlgorithm);
    AmazonS3EncryptionClient client = new AmazonS3EncryptionClient(materials);
    //Perform your operations, such as PutObject, GetObject, etc.

  • 创建一个AES算法实例并使用保存的SymmetricKey密钥加载它:

  • Aes aesAlgorithm = Aes.Create();

    aesAlgorithm.Key = File.ReadAllBytes(@"c:tempSymmetricKey.txt");
    EncryptionMaterials materials = new EncryptionMaterials(aesAlgorithm);
    AmazonS3EncryptionClient client = new AmazonS3EncryptionClient(materials);
    //Perform your operations, such as PutObject, GetObject, etc.