Azure Blob的动态加密

Azure Blob的动态加密,azure,encryption,azure-keyvault,azure-blob-storage,Azure,Encryption,Azure Keyvault,Azure Blob Storage,我有一个场景,在这个场景中,我需要从一个存储帐户中取出一个大小超过多GB的blob,并对其进行复制+加密,然后将其放入另一个blob存储帐户中。看起来我可以通过设置BlobenchyOptionPolicy并执行StartCopyAsync来实现这一点。但是,这需要密钥保险库访问权限,将下载此加密blob的系统将无法访问该保险库。我们也不能访问收件人的私钥,因为它是他们的,不是我们的,所以我们不能只将他们的.pfx加载到我们的保险库中 我不确定还有什么其他选择: 1.将blob下载到云服务的文件

我有一个场景,在这个场景中,我需要从一个存储帐户中取出一个大小超过多GB的blob,并对其进行复制+加密,然后将其放入另一个blob存储帐户中。看起来我可以通过设置BlobenchyOptionPolicy并执行StartCopyAsync来实现这一点。但是,这需要密钥保险库访问权限,将下载此加密blob的系统将无法访问该保险库。我们也不能访问收件人的私钥,因为它是他们的,不是我们的,所以我们不能只将他们的.pfx加载到我们的保险库中

我不确定还有什么其他选择: 1.将blob下载到云服务的文件系统,或者下载到azure文件存储帐户,并对其进行加密。 2.将加密文件上载到目标blob存储帐户。 3.从共享中删除加密文件

在这种情况下,是否有其他可行的方法

在这种情况下,是否有其他可行的方法

据我所知,azure存储有两种加密方式

一个是,Azure存储在持久化到存储之前自动加密您的数据,并在检索之前解密。加密、解密和密钥管理对用户完全透明

通过使用这种方式,azure将在上载到存储服务器时加密您的数据。当用户想要访问数据时,它将解密数据

您可以在门户中直接启用它,如下所示:

另一个是客户端加密,我们可以使用azure密钥值或本地密钥值来加密数据

因此,如果我们想使用客户端加密,我们需要从blob下载文件,然后对其进行加密并将其上载到另一个存储帐户

我们可以创建一个本地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存储位置。谢谢Brando。这并不是最终的解决方案,但它帮助了很多,所以我把它作为答案。
  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();


        }