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

如何使用C#对Azure CloudFile实现类似Blob的加密解密功能

Azure 存储的官方 .NET 客户端库没有为传统的 Microsoft.WindowsAzure.Storage.File 命名空间下的 CloudFile 提供和 BlobEncryptionPolicy 对等的内置加密策略类,你可以根据你使用的SDK版本选择对应方案实现和Blob侧一致的客户端加密效果:

方案1:适配旧版WindowsAzure.Storage SDK(v9及更早版本)

你可以手动复用Blob加密所用的信封加密逻辑,在流读写环节完成加解密,加密元数据存在CloudFile的自定义元数据中,示例实现如下:

加密上传代码

// 替换为你实际的RSA密钥实例
RSA rsa = <your_rsa_key>;
// 生成单次使用的AES256内容密钥和IV
using Aes aes = Aes.Create();
aes.KeySize = 256;
aes.GenerateKey();
aes.GenerateIV();

// 用RSA公钥加密AES内容密钥
byte[] encryptedContentKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.OaepSHA256);

// 初始化目标CloudFile实例
CloudFile targetFile = <your_cloud_file_instance>;
// 写入加密元数据到CloudFile
targetFile.Metadata.Add("encrypted_content_key", Convert.ToBase64String(encryptedContentKey));
targetFile.Metadata.Add("encryption_iv", Convert.ToBase64String(aes.IV));
targetFile.Metadata.Add("encryption_algorithm", "AES256_CBC");
targetFile.SetMetadata();

// 加密流后上传
using ICryptoTransform encryptor = aes.CreateEncryptor();
using Stream plaintextStream = <your_plain_content_stream>;
using CryptoStream cryptoStream = new CryptoStream(plaintextStream, encryptor, CryptoStreamMode.Read);
targetFile.UploadFromStream(cryptoStream);

解密下载代码

CloudFile sourceFile = <your_cloud_file_instance>;
// 先拉取文件元数据
sourceFile.FetchAttributes();

// 读取加密元数据
byte[] encryptedCek = Convert.FromBase64String(sourceFile.Metadata["encrypted_content_key"]);
byte[] iv = Convert.FromBase64String(sourceFile.Metadata["encryption_iv"]);
// 用RSA私钥解密得到AES内容密钥
byte[] contentKey = rsa.Decrypt(encryptedCek, RSAEncryptionPadding.OaepSHA256);

// 下载并解密内容
using Aes aes = Aes.Create();
aes.Key = contentKey;
aes.IV = iv;
using ICryptoTransform decryptor = aes.CreateDecryptor();
using MemoryStream encryptedStream = new MemoryStream();
sourceFile.DownloadToStream(encryptedStream);
encryptedStream.Position = 0;

using CryptoStream cryptoStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);
using MemoryStream plaintextStream = new MemoryStream();
cryptoStream.CopyTo(plaintextStream);
// plaintextStream即为解密后的明文内容

方案2:使用v12+版本Azure.Storage.Files.Shares SDK

新版文件共享SDK已经内置了和Blob侧完全一致的客户端加密能力,用法和你熟悉的Blob加密逻辑几乎完全相同,直接配置加密策略即可,不需要手动处理流加解密:

// 初始化加密策略,参数和BlobEncryptionPolicy完全一致
ShareClientEncryptionPolicy encryptionPolicy = new ShareClientEncryptionPolicy(rsa, null);
ShareClientOptions options = new ShareClientOptions
{
    ClientEncryptionPolicy = encryptionPolicy
};

// 用带加密配置的选项初始化ShareFileClient
ShareFileClient fileClient = new ShareFileClient("<storage_connection_string>", "<share_name>", "<file_path>", options);

// 后续上传下载会自动完成加解密
// 上传明文
fileClient.Upload(<plain_content_stream>);
// 下载自动得到明文
var downloadResult = fileClient.Download();

注意事项

  • 不要手动修改CloudFile中存储的加密相关元数据,否则会导致文件无法解密
  • 加密所用的RSA密钥需要妥善保管,密钥丢失会导致所有加密文件永久无法恢复
  • 该客户端加密和Azure存储默认的服务端加密互相独立,可以叠加使用

内容的提问来源于stack exchange,提问作者harpreet singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:27:00