C# 如何在azure密钥库中处理密钥旋转

C# 如何在azure密钥库中处理密钥旋转,c#,.net,azure,azure-keyvault,key-management,C#,.net,Azure,Azure Keyvault,Key Management,我必须在应用程序中实现关键点旋转。我有一些想法如何做到这一点,但我不确定,如果一切都是好的解决方案 好的,我们开始吧。我在应用程序中有几个地方使用KeyVault客户端(Azure KeyVault客户端)进行解密。这是一项很好的工作。在我的应用程序中,有些地方使用KeyVaultClient进行加密。目前(仍处于开发阶段),我正在使用硬编码参数(vaultBaseUrl、keyName、keyVersion)。但我想更进一步,将此参数移动到app.config文件 这里的问题是如何处理keyV

我必须在应用程序中实现关键点旋转。我有一些想法如何做到这一点,但我不确定,如果一切都是好的解决方案

好的,我们开始吧。我在应用程序中有几个地方使用KeyVault客户端(Azure KeyVault客户端)进行解密。这是一项很好的工作。在我的应用程序中,有些地方使用KeyVaultClient进行加密。目前(仍处于开发阶段),我正在使用硬编码参数(vaultBaseUrl、keyName、keyVersion)。但我想更进一步,将此参数移动到app.config文件

这里的问题是如何处理keyVersion变量(其余的我想我可以轻松地存储在app.config文件中,不是吗?)我有两个想法:

对于加密:

  • 我可以将当前密钥版本存储在app.config中,并在每次加密数据时使用此值
  • 我可以从KeyVault客户端读取所有密钥(GetKeyAsync),然后按活动标志过滤它们,并按过期日期排序。最后使用最新的
  • 用于解密:

  • 我可以将用于加密的密钥版本存储在加密数据中(将加密结果转换为Base64String)。我的意思是我可以在字符串结果中添加32个字符(keyVersion)前缀
  • 没有更多的想法,可能使用app.config中的keyVersion,但它会造成关键点旋转问题
  • 也许有什么工具/库可以帮我处理这些工作p

    目前,新密钥由管理员手动插入。在接下来的阶段中,我将为此执行预定任务

    也许有什么工具/库可以帮我处理这些工作

    正如您提到的,您需要加密密钥版本与解密密钥版本一致。如果你能分享你的场景,那就更好了。比如说。如果blob是加密的,它将有一个元数据[“encryptiondata”],其中包含keyId。在您的例子中,也许您还可以为对象添加一个带有keyId的属性。当您尝试解密时,您可以从该对象获取密钥ID

    目前,新密钥由管理员手动插入。在接下来的阶段中,我将为此执行预定任务

    如果您想创建密钥,可以在WebJob或Azure函数中使用下面的代码示例

    static string _clientId= "xxxxxxxxxxxxx";
    static string _clientSecret = "xxxxxxxxxxxxxxxx";
    static string _tenantId = "xxxxxxxxxxxxxxxx";
    public static async Task<string> GetAccessToken(string azureTenantId, string azureAppId, string azureSecretKey)
    {
       var context = new AuthenticationContext("https://login.windows.net/" + _tenantId);
       ClientCredential clientCredential = new ClientCredential(_clientId, _clientSecret);
       var tokenResponse = await context.AcquireTokenAsync("https://vault.azure.net", clientCredential);
       var accessToken = tokenResponse.AccessToken;
       return accessToken;
    }
    var kv = new KeyVaultClient(GetAccessToken);
    var result = kv.CreateKeyAsync(vault,keyName,keyType).Result;
    
    静态字符串_clientId=“xxxxxxxxxxxx”;
    静态字符串_clientSecret=“XXXXXXXXXXXXXX”;
    静态字符串_tenantId=“XXXXXXXXXXXXXX”;
    公共静态异步任务GetAccessToken(字符串AzureTentid、字符串azureAppId、字符串azureSecretKey)
    {
    var context=新的AuthenticationContext(“https://login.windows.net/“+_tenantId);
    ClientCredential ClientCredential=新的ClientCredential(\u clientId,\u clientSecret);
    var tokenResponse=await context.AcquireTokenAsync(“https://vault.azure.net“,客户端凭据);
    var accessToken=tokenResponse.accessToken;
    返回accessToken;
    }
    var kv=新的KeyVaultClient(GetAccessToken);
    var结果=kv.CreateKeyAsync(vault、keyName、keyType);