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 存储))。 - 错误:请为您的数据集选择一个工作表

无法加密 Azure CloudFile。能够加密 Azure Blob

索引 Azure 存储上的加密 Blob

应用加密后 Azure Blob 超时

Azure 存储 blob 客户端加密不解密 Java

在 Azure Blob 存储中加密图像