不使用KeyVault的Azure表存储客户端加密

vig*_*ity 2 c# encryption cryptography azure azure-table-storage

我有一些敏感信息,我想加密并存储在Azure表存储中.老实说,从一种天真的方法来看,对所有值使用相同的AES密钥可能就足够了,因为我无法接近有足够的数据加密,以便有人进行任何有意义的密码分析.但是,我知道最佳做法是限制使用相同的对称密钥.

最近,Microsoft通过Azure KeyVault发布了Azure表存储的客户端加密.它允许您生成RSA密钥并将其存储在KeyVault中,客户端库将为表存储中的每一行生成一个新的对称密钥,并使用您的RSA密钥加密对称密钥.这是完美的,因为无法对密文进行差分密码分析,因为它们都使用不同的密钥.它特别好,因为他们的库完成了所有的管道工作,你所要做的就是从KeyVault获取你的RSA密钥,用EncryptPropertyAttribute它来装饰你指定的属性并处理其他所有东西.

摩擦......我个人认为KeyVault有点使用和管理.您必须使用powershell在您的应用程序和keyvault之间设置oauth身份验证,这看起来像存储单个RSA密钥的巨大开销.如果我们有数百个密钥要存储,我可以想象它会更有用.

有没有办法使用所有Microsoft的客户端加密代码而不将RsaKey存储在KeyVault中?

vig*_*ity 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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是解决该问题的好方法.通常,这就是Storage使用IKey接口的原因 - 您可以实现自定义密钥算法或执行类似操作并连接到自定义密钥服务.看起来你有一个你喜欢的解决方案,但如果你想提交一个问题[这里](https://github.com/Azure/azure-sdk-for-net)或直接发送电子邮件给emgerner在microsoft dot com ,我们很乐意收到有关任何KeyVault可用性问题的反馈和/或帮助您使其满足您的需求! (2认同)