You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#将AWS Encryption SDK生成的CipherText发送至REST API及存储咨询

C#实现:AWS Encryption SDK密文发送REST API及长期存储方案

一、将CipherText发送至REST API

生成的CipherText是二进制数据,直接通过REST API传输容易出现编码问题,通常先转成Base64字符串再发送。以下用HttpClient实现核心发送逻辑:

代码示例

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Amazon.EncryptionSDK.Model;

class CipherTextApiSender
{
    private readonly HttpClient _httpClient;

    public CipherTextApiSender()
    {
        _httpClient = new HttpClient();
        _httpClient.BaseAddress = new Uri("https://your-target-api.com/");
    }

    public async Task SendEncryptedDataAsync(Ciphertext cipherText)
    {
        // 二进制密文转Base64,适配API文本传输要求
        string base64Cipher = Convert.ToBase64String(cipherText.CiphertextBlob);

        // 构造请求体(示例用JSON格式,可根据API要求调整为form-data/raw二进制)
        var requestPayload = new
        {
            EncryptedContent = base64Cipher,
            EncryptionContext = cipherText.EncryptionContext
        };

        string jsonBody = System.Text.Json.JsonSerializer.Serialize(requestPayload);
        var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

        // 发送POST请求
        HttpResponseMessage response = await _httpClient.PostAsync("api/v1/encrypted-data", content);
        response.EnsureSuccessStatusCode(); // 校验请求结果,失败时抛出异常
    }
}

关键注意点

  • 若API支持二进制直接传输,可跳过Base64转换,直接将CiphertextBlob封装为ByteArrayContent发送
  • 必须保留EncryptionContext:解密时需要用它验证密文合法性,务必随密文一同传递

二、CipherText长期存储方案

结合AWS生态,推荐以下3种适配不同场景的存储方案,均支持C# SDK直接操作:

1. Amazon S3(大体积密文首选)

适合存储GB级以上密文,支持分层存储(低成本归档)、版本控制、双重加密,是最通用的对象存储方案。

C#实现代码

using Amazon.S3;
using Amazon.S3.Model;
using System.Threading.Tasks;

class S3CipherStorage
{
    private readonly IAmazonS3 _s3Client;
    private const string TargetBucket = "your-encrypted-data-bucket";

    public S3CipherStorage()
    {
        // 初始化S3客户端(通过IAM角色或本地配置自动获取凭证)
        _s3Client = new AmazonS3Client();
    }

    public async Task StoreInS3Async(Ciphertext cipherText, string objectKey)
    {
        var putRequest = new PutObjectRequest
        {
            BucketName = TargetBucket,
            Key = objectKey, // 自定义存储路径/文件名,如"user-data/2024/encrypted-profile.bin"
            InputStream = new System.IO.MemoryStream(cipherText.CiphertextBlob),
            // 可选:开启S3服务器端二次加密,增强安全性
            ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256,
            // 可选:设置低成本归档存储类,适合长期冷数据
            StorageClass = S3StorageClass.Glacier
        };

        // 将加密上下文附加到对象元数据,方便后续管理与校验
        foreach (var kvp in cipherText.EncryptionContext)
        {
            putRequest.Metadata.Add(kvp.Key, kvp.Value);
        }

        await _s3Client.PutObjectAsync(putRequest);
    }
}

2. Amazon DynamoDB(小体积密文+结构化存储)

适合密文与业务结构化数据(如用户ID、加密时间)绑定存储的场景,支持TTL自动过期、细粒度访问控制。

C#实现代码

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using System.Threading.Tasks;

class DynamoDBCipherStorage
{
    private readonly IAmazonDynamoDB _dynamoClient;
    private const string TargetTable = "EncryptedUserData";

    public DynamoDBCipherStorage()
    {
        _dynamoClient = new AmazonDynamoDBClient();
    }

    public async Task StoreInDynamoDBAsync(Ciphertext cipherText, string userId)
    {
        var table = Table.LoadTable(_dynamoClient, TargetTable);
        var dataDoc = new Document
        {
            ["UserId"] = userId,
            ["CipherTextBase64"] = Convert.ToBase64String(cipherText.CiphertextBlob),
            ["EncryptionContext"] = cipherText.EncryptionContext,
            // 可选:设置TTL,自动删除5年后的过期数据
            ["TTL"] = DateTimeOffset.UtcNow.AddYears(5).ToUnixTimeSeconds()
        };

        await table.PutItemAsync(dataDoc);
    }
}

3. Amazon EFS(文件系统式存储)

适合需要像本地文件一样读写密文的场景,支持多应用实例共享访问,适合批量密文存储。

C#实现代码

using System.IO;
using System.Threading.Tasks;

class EFSCipherStorage
{
    private const string EfsMountDir = "/mnt/efs/encrypted-assets/";

    public async Task StoreInEFSAsync(Ciphertext cipherText, string fileName)
    {
        string fullFilePath = Path.Combine(EfsMountDir, fileName);
        // 写入密文文件
        await File.WriteAllBytesAsync(fullFilePath, cipherText.CiphertextBlob);

        // 配套写入加密上下文元数据文件,方便后续解密使用
        string metaFilePath = Path.ChangeExtension(fullFilePath, ".meta");
        string metaContent = System.Text.Json.JsonSerializer.Serialize(cipherText.EncryptionContext);
        await File.WriteAllTextAsync(metaFilePath, metaContent);
    }
}

存储通用规则

  • 加密上下文必须与密文绑定存储,否则无法正常解密
  • 通过IAM策略严格限制存储资源的访问权限,仅授权必要角色读取
  • 开启版本控制(S3)或点-in-time恢复(DynamoDB),防止数据误删
  • 配置生命周期规则,自动将冷数据移至低成本归档层,降低存储成本

内容的提问来源于stack exchange,提问作者N Calicut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:15:36