2015-08-19 2 views
2

У меня есть конфиденциальная информация, которую я хочу зашифровать и сохранить в хранилище таблиц Azure. Честно говоря, с наивного подхода, использование одного и того же ключа AES для всех значений, вероятно, было бы достаточным, так как я бы нигде не приблизился к подходу, имеющему достаточно данных, зашифрованных для того, чтобы кто-то мог сделать какой-либо значимый криптоанализ. Но я знаю, что наилучшей практикой является ограничение использования одного и того же симметричного ключа.Шифрование на стороне клиента на базе Azure БЕЗ использования KeyVault

Недавно Microsoft выпустила шифрование на стороне клиента для хранения таблиц Azure через Azure KeyVault. Он позволяет генерировать ключ RSA и хранить его в KeyVault, и клиентская библиотека генерирует новый симметричный ключ для каждой строки в хранилище таблиц и шифрует симметричный ключ с помощью ключа RSA. Это прекрасно, потому что нет способа сделать дифференциальный криптоанализ на зашифрованном тексте, поскольку все они использовали разные ключи. Это особенно приятно, потому что их библиотека делает всю сантехнику, все, что вам нужно сделать, это захватить ключ RSA от KeyVault, украсить ваши назначенные свойства EncryptPropertyAttribute и обрабатывать все остальное.

В этом заключается втир ... Я лично считаю, что KeyVault является тупым для использования и управления. Вы должны использовать powershell для настройки аутентификации oauth между вашим приложением и keyvault, и это выглядит как огромное количество накладных расходов для хранения одного ключа RSA. Если у нас есть сотни ключей для хранения, я могу себе представить, что это было бы намного полезнее.

Можно ли использовать весь код шифрования на стороне клиента Microsoft, не сохраняя RsaKey в KeyVault?

ответ

5

Мне понадобилось некоторое время, чтобы найти его, но да, вы можете хранить ключ RSA вне KeyVault. Вам просто нужно использовать перегрузку конструктора RsaKey, которая принимает RSACryptoServiceProvider, которую вы захватываете из того места, где вы считаете разумным. Я вытащил мой из моего web.config. Тем не менее, я уверен, что мое производство RsaCsp не хранится в исходном управлении, и я добавляю его непосредственно на экране конфигурации Azure Web App.

IKey tableStorageKey = GetTableStorageKey() 
_tableRequestOptions = new TableRequestOptions 
{ 
    EncryptionPolicy = new TableEncryptionPolicy(tableStorageKey, null) 
}; 

... 

private IKey GetTableStorageKey() 
{ 
    using (var rsaCsp = new RSACryptoServiceProvider(2048)) 
    { 
     try 
     { 
      //it doesn't really matter where you get your RsaCsp from, I have mine in my webconfig 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); 
      XmlElement node = doc.SelectSingleNode("/configuration/MyTableStorageRsaKey") as XmlElement; 

      rsaCsp.FromXmlString(node.OuterXml); 

      return new RsaKey("MyTableStorageRsaKey", rsaCsp); 
     } 
     finally 
     { 
      rsaCsp.PersistKeyInCsp = false; 
     } 

    } 
} 
+2

Это отличный способ решить эту проблему. В общем, это причина, по которой Storage использует интерфейс IKey - вы можете реализовать алгоритм пользовательских ключей или сделать что-то вроде этого и подключиться к службе пользовательских ключей. Похоже, у вас есть решение, которое вам нравится, но если вы хотите отправить вопрос [здесь] (https://github.com/Azure/azure-sdk-for-net) или отправить мне электронное письмо прямо на emgerner в microsoft dot com , мы будем рады принять обратную связь по любым вопросам удобства использования KeyVault и/или помочь вам заставить его работать в соответствии с вашими потребностями! –

2

В Microsoft.Azure.KeyVault.Cryptography, есть изменения в RsaKey конструктора. Теперь он не импортирует ключ из RSACryptoServiceProvider, но использует его напрямую и использует его в методе Dispose(). Поэтому использование изменится:

public RsaKey GetFromXmlString(string xmlString) 
    { 
     try 
     { 
      var rsaCsp = new RSACryptoServiceProvider(2048, new CspParameters() { KeyContainerName = "MyTableStorageRsaKey" }); 
      rsaCsp.FromXmlString(xmlString); 
      rsaCsp.PersistKeyInCsp = false; 
      return new RsaKey("MyTableStorageRsaKey", rsaCsp); 
     } 
     catch (Exception ex) 
     { 
      throw new InvalidOperationException("Invalid rsa key xmlString provided", ex); 
     } 
    } 

Обратите внимание, что экземпляр RSACryptoServiceProvider не склонен. Также обратите внимание, что RsaKey является IDisposable.

Смежные вопросы