0

Я использую this approach для шифрования файлов и сохранения их в блоках блока Azure. Я хотел бы скопировать зашифрованный blob в другую учетную запись памяти blob и расшифровать ее в процессе. Я знаю, что можно выполнить операцию «копировать блоб», которая выполняется полностью внутри Azure асинхронно и не загружает содержимое blob через мой локальный компьютер в пути. Я считаю, что это достигается с помощью метода CloudBlockBlob.StartCopy. Но возможно ли это сделать с зашифрованным файлом и расшифровать его при переходе на другую учетную запись?Расшифровывать и копировать blob на другую учетную запись памяти blob?

Следуя этой ссылке выше, мой код выглядит следующим образом. blob.OpenRead работы но blob2.StartCopy не работает.

BlobEncryptionPolicy policy = new BlobEncryptionPolicy(null, cloudResolver); 
BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy }; 
CloudBlockBlob blob = container.GetBlockBlobReference("MyFile.txt"); 
//var blobStream = blob.OpenRead(null, options); //this works 

CloudBlockBlob blob2 = container2.GetBlockBlobReference("MyFile2.txt"); 
blob2.StartCopy(blob, null, null, options, null); //this fails with: The remote server returned an error: (404) Not Found. 
+0

Какого NuGet пакет и версию вы используете для управления учетными записями? – juvchan

+0

@juvchan 6.1 Microsoft.WindowsAzure.Storage DLL – GregGalloway

+0

просто убедитесь, что ваша учетная запись хранилища создана в режиме класса или в режиме диспетчера ресурсов? Похоже, что раньше вы использовали nuget. – juvchan

ответ

5

Ответ в том, что шифрование выполняется в клиентской библиотеке для хранения, так что если вы делаете копию блобы для новой учетной записи для хранения она по-прежнему будет зашифрована.

Причина, по которой ваш код не работает, заключается в том, что исходный блок находится в контейнере Private. Для копирования кросс-аккаунта исходный блок должен быть общедоступным. В пределах одной учетной записи хранилища вы можете скопировать blob из частного контейнера. AFAIK, ошибка не имеет ничего общего с шифрованием.

Что вы могли бы сделать, это создать URL SAS на исходном сгустке, а затем с помощью следующего переопределения StartCopy метода:

public string StartCopy(
    Uri source, 
    AccessCondition sourceAccessCondition = null, 
    AccessCondition destAccessCondition = null, 
    BlobRequestOptions options = null, 
    OperationContext operationContext = null 
) 

Вот пример кода, чтобы сделать это:

private static void StartCopyAcrossAccount() 
    { 
     var sourceAccount = new CloudStorageAccount(new StorageCredentials("source-account-name", "source-account-key"), true); 
     var sourceContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("source-container"); 
     var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name"); 
     var sourceBlobSas = sourceBlob.GetSharedAccessSignature(new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy() 
      { 
       SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1), 
       Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read 
      }); 
     var sourceBlobSasUrl = sourceBlob.Uri.AbsoluteUri + sourceBlobSas; 

     var targetAccount = new CloudStorageAccount(new StorageCredentials("target-account-name", "target-account-key"), true); 
     var targetContainer = targetAccount.CreateCloudBlobClient().GetContainerReference("target-container"); 
     var targetBlob = targetContainer.GetBlockBlobReference("blob-name"); 

     var copyId = targetBlob.StartCopy(new Uri(sourceBlobSasUrl), null, null); 
    } 
+1

Gaurav, это фантастический ответ, и я многому научился у него о копировании блоба. Благодаря! Я отредактировал ответ, чтобы уточнить, что зашифрованный файл остается зашифрованным. С вашим кодом CopyBlob преуспевает, но файл зашифрован в контейнере назначения. Я считаю, что это потому, что копия blob просто дублирует blob, не расшифровывая его в пути. Не стесняйтесь просматривать мое редактирование на свой ответ, но я соглашусь с ним сейчас. – GregGalloway

+1

'Я считаю, что это потому, что копия blob просто дублирует blob, не расшифровывая его в пути.' - Это правильно. Операция копирования blob просто копирует байты из источника в цель. Обратите внимание, что операция копирования blob может использоваться не только для копирования Azure Blobs в одну и ту же/через учетную запись хранилища, но также может быть использована для копирования любого общедоступного файла (например, файла, размещенного в Amazon S3, например) для хранения памяти. Таким образом, он не знает (заботится) о блобе. –

+0

ничего себе! Я этого не знал. Думал, что это было только для копирования блоба.Если вы не ведете блог о копировании с S3 без файла, проходящего через клиентский компьютер .NET, который будет хорошим сообщением. – GregGalloway