2015-08-19 60 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