我的客户端应用程序生成在设备上加密的数据。加密密钥通过 HTTPS 发送到 Azure 函数,该函数使用 Azure Key Vault 存储加密密钥,以便其他授权客户端可以获取它们并解密数据。
这是我的 Azure 函数中的一段代码,用于执行将加密密钥(秘密)保存在密钥保管库中的工作:
public async Task InsertEncryptionKeyAsync(EncryptionKeyContract encryptionKey)
{
Guard.CheckForNull(encryptionKey, nameof(encryptionKey));
// Serializes the encryption key information.
string serializedEncryptionKey = JsonConvert.SerializeObject(encryptionKey);
// Pushes the encryption to the Key-Vault.
var client = new KeyVaultClient(/* Key-vault- access otken*/, new HttpClient());
await client.SetSecretAsync(Constants.Vault.Url, encryptionKey.FileId.ToKey(), serializedEncryptionKey);
}
问题
此设计是否适合 Azure Key Vault 的使用?
是的,Azure Key Vault 用于存储密钥/机密,因此这是一个完美的有效用例。根据您的客户是谁以及他们拥有什么权限,您可以摆脱中间件并让客户将加密密钥添加到保管库中。但通常您不想向客户端授予对保管库的权限,因此使用 Azure 函数执行此操作看起来也不错。
我同意 Martin 的观点,这是 KeyVault 的一个很好的用例。
您可能希望进一步依赖 keyvault 的功能。
假设您在客户端使用对称加密,keyvault 有wrappKey,用于存储密钥。
使用wrapKey / unwrapKey意味着您的客户端可以使用访问策略授予他们可以使用密钥执行的操作的特定权限。
您可能还希望对加密内容进行签名和验证,以确保其在传输过程中不会被操纵。
如果您还没有走这条路线,您可能希望研究本机应用程序 AD 身份验证 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios 和 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-application-objects 可以代表用户或服务主体工作,从而提供一个不错的层关于 keyvault 访问控制如何工作......但我不会详细说明,因为我将跟踪原始问题。值得注意的是,密钥保管库的访问策略限制为 16 个,因此它更适合应用程序组,而不是个人安装或用户。
我将所有用户的加密密钥保存在 Azure Key Vault 中,仅允许将 Web 应用程序作为托管实体进行访问。
从本地主机运行很痛苦,但这是最安全的方式。