我有一些敏感信息,我希望加密并存储在Azure表存储中。老实说,从一种天真的方法来看,对所有值使用相同的AES密钥可能就足够了,因为我无法接近有足够的数据加密,以便有人进行任何有意义的密码分析。但是,我知道最佳做法是限制使用相同的对称密钥。
最近,Microsoft通过Azure KeyVault发布了Azure表存储的客户端加密。它允许您生成RSA密钥并将其存储在KeyVault中,客户端库将为表存储中的每一行生成一个新的对称密钥,并使用您的RSA密钥加密对称密钥。这是完美的,因为无法对密文进行差分密码分析,因为它们都使用不同的密钥。它特别好,因为他们的库可以完成所有的管道工作,您只需从KeyVault获取RSA密钥,使用EncryptPropertyAttribute
修饰指定的属性,然后处理其他所有内容。
其中存在的问题......我个人认为KeyVault有点使用和管理。您必须使用powershell在您的应用程序和keyvault之间设置oauth身份验证,这看起来像存储单个RSA密钥的巨大开销。如果我们有数百个密钥存储,我可以想象它会更有用。
有没有办法使用所有Microsoft的客户端加密代码而不将RsaKey存储在KeyVault中?
答案 0 :(得分: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;
}
}
}