В движении шифрование Azure Blobs
У меня есть сценарий, в котором мне нужно взять большой двоичный объект (размером более нескольких ГБ) из одной учетной записи хранения и скопировать + зашифровать его и поместить в другую учетную запись хранения больших двоичных объектов. Похоже, я мог бы сделать это, установив BlobEncryptionPolicy и выполнив StartCopyAsync. Однако для этого требуется доступ к хранилищу ключей, и система, которая загрузит этот зашифрованный большой двоичный объект, не будет иметь доступа к этому хранилищу. У нас также нет доступа к закрытому ключу получателя (потому что он принадлежит нам, а не нашему), поэтому мы не можем просто загрузить их.pfx в наше хранилище.
Принимая это во внимание, я не уверен, какой еще вариант существует: 1. Загрузите большой двоичный объект в файловую систему облачной службы (или, возможно, в учетную запись хранилища файлов Azure) и зашифруйте его. 2. Загрузите зашифрованный файл в целевую учетную запись хранилища BLOB-объектов. 3. Удалите зашифрованный файл из общего ресурса.
Есть ли другие подходы, которые могут работать в этом случае?
1 ответ
Есть ли другие подходы, которые могут работать в этом случае?
Насколько я знаю, хранилище Azure имеет два шифрования.
Одним из них является шифрование на стороне сервера, хранилище Azure автоматически шифрует ваши данные перед сохранением в хранилище и дешифрует перед извлечением. Шифрование, дешифрование и управление ключами полностью прозрачны для пользователей.
Используя этот способ, Azure будет шифровать ваши данные при загрузке на сервер хранения. Он расшифрует данные, когда пользователь захочет получить к ним доступ.
Вы можете напрямую включить его на портале, как показано ниже:
Другой - шифрование на стороне клиента, мы могли бы использовать значение ключа Azure или значение локального ключа для шифрования данных.
Поэтому, если мы хотим использовать шифрование на стороне клиента, нам нужно загрузить файл из BLOB-объекта, затем зашифровать его и загрузить в другую учетную запись хранения.
Это шифрование на стороне клиента без использования Azure Key-Value.
Мы могли бы создать локальный ключ 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);
}
}
Загрузите зашифрованный блоб и загрузите расшифрованный блоб:
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();
}
Кроме того, операция копирования больших двоичных объектов просто копирует байты из источника в цель на стороне сервера. Таким образом, он не будет шифровать его, когда сервер скопирует файл.