2015-08-19 87 views
2

我有一些敏感信息需要加密並存儲在Azure表存儲中。老實說,從一個天真的方法,使用相同的AES密鑰的所有值可能會是足夠的,因爲我無法接近方法有足夠的數據加密,以便有人做任何有意義的密碼分析。但是,我知道最好的做法是限制使用相同的對稱密鑰。Azure表存儲客戶端加密而不使用KeyVault

最近,Microsoft通過Azure KeyVault發佈了Azure表存儲的客戶端加密。它允許您生成RSA密鑰並將其存儲在KeyVault中,客戶端庫將爲表存儲中的每一行生成一個新的對稱密鑰,並使用RSA密鑰加密對稱密鑰。這是完美的,因爲它們都使用不同的密鑰,因此無法對密文進行差分密碼分析。這是特別好的,因爲他們的圖書館完成所有的管道工作,所有你需要做的就是從KeyVault獲取你的RSA密鑰,用EncryptPropertyAttribute裝飾你指定的屬性,它處理所有其他事情。

其中存在着磨擦......我個人發現KeyVault有一種鈍角使用和管理。您必須使用powershell來設置您的應用程序和keyvault之間的oauth身份驗證,並且它看起來像是存儲單個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的實例未配置。 另請注意,RsaKeyIDisposable