Получение сообщения об ошибке "Произошла ошибка при декодировании заполнения OAEP" при попытке извлечь объекты из хранилища таблиц Azure

Я шифрую таблицу следующим образом.

public TableRequestOptions EncryptTableStorage()
    {
        // Create the IKey used for encryption.
        var key = new RsaKey("mykey");

        var policy = new TableEncryptionPolicy(key, null);

        TableRequestOptions options = new TableRequestOptions()
        {
            EncryptionPolicy = policy
        };


        return options;

    }

Моя зашифрованная сущность

 [EncryptProperty]
 public string ConsumerId { get; set; }

При получении я использую следующий код

var query = new TableQuery<CloudModelDetail>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, cloudModelDetail.PartitionKey));
foreach (var entity in azureStorageAccount.VerifyCloudTable.ExecuteQuery(query, azureStorageAccount.EncryptTableStorage()))
{
  Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
                    entity.ConsumerId, entity.ScoreVariables);
}

Я получаю сообщение об ошибке расшифровки. Внутреннее исключение говорит: "Произошла ошибка при декодировании заполнения OAEP".

2 ответа

Я также попробовал ваш код и официальный код документа. Если мы запросим у таблицы только одну сущность в результате запроса, то мы сможем правильно получить расшифрованную информацию. Если более чем один объект, то он получит ту же ошибку "Ошибка при декодировании заполнения OAEP". как вы упомянули. Похоже, что SDK не поддерживает запрос большего количества объектов одновременно. Мы можем сообщить о наших требованиях в проект хранилища Azure SDK или оставить отзыв о нашей команде Azure.

Обновить:

демонстрационный код:

    static void Main(string[] args)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       "Your storage connection string");

        RsaKey key = new RsaKey("mykey" /* key identifier */);

        // Create the encryption policy to be used for upload and download.
        TableEncryptionPolicy policy = new TableEncryptionPolicy(key, null);

        TableRequestOptions options = new TableRequestOptions
        {
            EncryptionPolicy = policy
        };


        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        // Create the CloudTable object that represents the "tomtest" table.
        CloudTable table = tableClient.GetTableReference("tomtest");

        table.CreateIfNotExists();

        var insertList = new List<CloudModelDetail>();

        var cloudModelDetailEntity = new CloudModelDetail { ConsumerId = "0001-"+Guid.NewGuid() };

        table.Execute(TableOperation.Insert(cloudModelDetailEntity), options);

        TableRequestOptions retrieveoptions = new TableRequestOptions
        {
            EncryptionPolicy = policy
        };

        var query =
            new TableQuery<CloudModelDetail>().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, cloudModelDetailEntity.RowKey));

       var list = table.ExecuteQuery(query, retrieveoptions);
        foreach (CloudModelDetail entity in list)
        {
            Console.WriteLine($"PartionKey:{entity.PartitionKey},RowKey:{entity.RowKey},ConsumerId: {entity.ConsumerId}");
        }

        Console.ReadKey();
    }



    public class CloudModelDetail : TableEntity
    {
        [EncryptProperty]
        public string ConsumerId { get; set; }
        public CloudModelDetail()
        {
            PartitionKey = "Name";
            RowKey = Guid.NewGuid().ToString();

        }
    }

Обновление: оказывается, это не сработало; Я случайно изменил что-то, что отключило шифрование.

Я получил исключение как с Execute, так и с ExecuteQuerySegmented. Для меня решением оказалось установить дату активации ключа (ранее он не был установлен - флажок не установлен).

Конфигурация ключевой версии

Другие вопросы по тегам