如何使用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
相关产品推荐
相关产品推荐

