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

标签 c# azure encryption cryptography azure-table-storage

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

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

这就是问题所在......我个人认为 KeyVault 使用和管理起来有点迟钝。您必须使用 powershell 在应用程序和 keyvault 之间设置 oauth 身份验证,并且存储单个 RSA key 看起来会产生巨大的开销。如果我们有数百个 key 要存储,我可以想象它会更有用。

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

最佳答案

我花了一段时间才找到它,但是,是的,您可以将 RSA key 存储在 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;
        }

    }
}

关于c# - 不使用 KeyVault 的 Azure 表存储客户端加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32098448/

相关文章:

grails - Jasypt:从外部文件读取配置

c# - 通过 URL 运行 Azure Webjob

c# - 使 C# 程序能够在任何操作系统上编译

c# - 内存未释放 .Net 应用程序

azure - 在 PowerBI 中连接到服务器上带有参数的存储过程

系统中不存在具有指定 ID 的 Azure 逻辑应用 CosmosDB 实体

c# - 反序列化为自身

AzurePowershell 任务找不到 Profile.ps1

java - 通过安全消息从智能卡中读取信息

ssl - 使用 orapki/wallet manager 在 oracle 11g 中使用 sha-256 作为哈希算法创建证书