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