如何处理azure密钥库中的密钥轮换

时间:2018-01-24 23:02:23

标签: c# .net azure azure-keyvault key-management

我必须在我的应用程序中实现键旋转。我知道如何做到这一点,但我不确定该解决方案是否一切正常。

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

这里的问题开始了如何处理keyVersion变量(其余的我认为我可以轻松存储在app.config文件中,不是吗?)我有几点想法:

加密:

  1. 我可以在app.config中存储当前的keyVersion,并在每次加密数据时使用此值。
  2. 我可以从KeyVaultClients读取所有密钥(GetKeysAsync),然后按活动标记过滤它们,并按到期日期排序。最后使用最新的。
  3. 解密:

    1. 我可以将用于加密的keyVersion存储在加密数据中(我转换为Base64String的加密结果)。我的意思是我可以在字符串结果中添加32个字符(keyVersion)前缀。
    2. 没有更多的想法,也许使用app.config中的keyVersion,但它会导致键旋转出现问题。
    3. 也许有一些工具/库可以帮我处理这一切? :P

      目前,管理员手动插入新密钥。在接下来的阶段,我将为此实施计划任务。

1 个答案:

答案 0 :(得分:1)

  

也许有一些工具/库可以帮我处理这一切?

正如您所提到的,您需要加密密钥版本与解密密钥版本一致。如果您可以分享您的方案,那就更好了。以Encrypt blob为例。如果blob已加密,则其中将包含带有keyId的元数据[“encryptiondata”]。在您的情况下,也许您还可以为对象添加具有keyId的属性。当您尝试解密时,您可以从对象获取keyId。

  

目前,管理员手动插入新密钥。在接下来的阶段,我将为此实施计划任务。

如果要创建密钥,可以在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;