Azure Blob 的动态加密
Posted
技术标签:
【中文标题】Azure Blob 的动态加密【英文标题】:In motion encryption of Azure Blobs 【发布时间】:2017-10-10 21:10:16 【问题描述】:我有一个场景,我需要从一个存储帐户中获取一个 blob(大小超过几 GB),然后对其进行复制 + 加密并将其放入另一个 blob 存储帐户中。看起来我可以通过设置 BlobEncryptionPolicy 并执行 StartCopyAsync 来做到这一点。但是,这需要 Key Vault 访问权限,并且将下载此加密 blob 的系统将无权访问该保管库。我们也无法访问收件人的私钥(因为这是他们的,不是我们的),所以我们不能将他们的 .pfx 加载到我们的保管库中。
考虑到这一点,我不确定还有什么其他选择: 1. 将 blob 下载到云服务的文件系统(或者可能下载到 azure 文件存储帐户)并对其进行加密。 2. 将加密文件上传到目标 blob 存储帐户。 3. 从共享中删除加密文件。
在这种情况下是否有其他方法可能有效?
【问题讨论】:
【参考方案1】:在这种情况下还有其他方法可以工作吗?
据我所知,azure storage有两种加密方式。
一个是server-side encryption,Azure 存储会在保存到存储之前自动加密您的数据并在检索之前解密。加密、解密和密钥管理对用户完全透明。
通过使用这种方式,Azure 会在上传到存储服务器时对您的数据进行加密。 当用户想要访问数据时,它会解密数据。
您可以直接在门户中启用它,如下所示:
另一种是客户端加密,我们可以使用 azure key value 或 local key value 来加密数据。
因此,如果我们想使用客户端加密,我们需要从 blob 下载文件,然后对其进行加密并将其上传到另一个存储帐户。
This is the client-side Encryption without use azure key-value way.
我们可以创建一个本地 rsa 密钥对其进行加密,然后您可以将此 rsa 密钥存储在本地。
如果您想从 blob 中解密加密的内容,您可以使用 rsa 密钥。
更多细节,您可以参考以下示例:
LocalResolver.cs(用来存放ikey)
public class LocalResolver : IKeyResolver
private Dictionary<string, IKey> keys = new Dictionary<string, IKey>();
public void Add(IKey key)
keys[key.Kid] = key;
public async Task<IKey> ResolveKeyAsync(string kid, CancellationToken token)
IKey result;
keys.TryGetValue(kid, out result);
return await Task.FromResult(result);
上传加密 blob 并下载解密 blob:
static void Main(string[] args)
Console.WriteLine("Blob encryption sample");
// Retrieve storage account information from connection string
// How to create a storage connection string - https://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
"DefaultEndpointsProtocol=https;AccountName=brandofirststorage;AccountKey=4j8EjQzNtkzQ22Xp3NZcxvJz/+PUOOOQRTSZ9TieQg1lYM6eBCDpKoJgMcNWoG6p1GjMQhkYrxPKRBralzQoZA==;EndpointSuffix=core.windows.net");
CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("example");
container.CreateIfNotExists();
int size = 5 * 1024 * 1024;
byte[] buffer = new byte[size];
Random rand = new Random();
rand.NextBytes(buffer);
CloudBlockBlob blob = container.GetBlockBlobReference("test");
// Create the IKey used for encryption.
RsaKey key = new RsaKey("private:key1");
// Create the encryption policy to be used for upload.
BlobEncryptionPolicy uploadPolicy = new BlobEncryptionPolicy(key, null);
// Set the encryption policy on the request options.
BlobRequestOptions uploadOptions = new BlobRequestOptions() EncryptionPolicy = uploadPolicy ;
Console.WriteLine("Uploading the encrypted blob.");
// Upload the encrypted contents to the blob.
using (MemoryStream stream = new MemoryStream(buffer))
blob.UploadFromStream(stream, size, null, uploadOptions, null);
// Download the encrypted blob.
// For downloads, a resolver can be set up that will help pick the key based on the key id.
LocalResolver resolver = new LocalResolver();
resolver.Add(key);
BlobEncryptionPolicy downloadPolicy = new BlobEncryptionPolicy(null, resolver);
// Set the decryption policy on the request options.
BlobRequestOptions downloadOptions = new BlobRequestOptions() EncryptionPolicy = downloadPolicy ;
Console.WriteLine("Downloading the encrypted blob.");
// Download and decrypt the encrypted contents from the blob.
using (MemoryStream outputStream = new MemoryStream())
blob.DownloadToStream(outputStream, null, downloadOptions, null);
Console.WriteLine("Press enter key to exit");
Console.ReadLine();
此外,复制 blob 操作只是将字节从源复制到服务器端的目标。所以当服务器复制文件时它不会加密它。
【讨论】:
人力资源部。这可能会奏效。我今天会在这里测试并报告。 所以,在阅读完这篇文章之后,看起来这仍然是一个两部分的操作。首先,我必须下载、加密并将数据保存在某个地方(比如磁盘上的文件)。然后我必须将该文件上传到第二个 blob 存储位置。 谢谢白兰度。这最终不是最终的解决方案,但它帮助很大,所以我将其标记为答案。以上是关于Azure Blob 的动态加密的主要内容,如果未能解决你的问题,请参考以下文章
源数据集中的动态工作表名称:Azure 数据工厂上的(Excel(Blob 存储))。 - 错误:请为您的数据集选择一个工作表