Rah*_*til 6 azure azure-keyvault
我正在开发一个应用程序,我想存储服务帐户的用户名和密码,这将由守护程序服务使用.
我们的想法是为应用程序管理员提供一个仪表板,他/她可以在其中输入服务帐户的凭据,以后可以将其存储在安全的地方.
我可以考虑将它存储在像Azure Vault这样的安全位置,并在需要时从那里获取它.但是,密钥和密钥是Azure Vault中的不同实体.我无法将它们存储在某个组合中.
以前有人这样做过吗?或者,在Azure中存储凭据是否有更好的替代方案?
小智 7
您可以使用Azure blob存储用于加密静态数据的技术(信封方法):https: //docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption
KeyVault具有包装/解包(加密/解密)对称密钥的能力,因此您可以安全地存储加密数据.
以下是一般步骤:
你需要这些nuget包:
Install-Package Microsoft.Azure.KeyVault
Install-Package Microsoft.Azure.KeyVault.Extensions
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.16.204221202
Run Code Online (Sandbox Code Playgroud)
获取KeyVaultKeyResolver的参考
KeyVaultKeyResolver cloudResolver = new KeyVaultKeyResolver(Utils.GetToken);
// Example GetToken implementation
public class Utils {
// Retrive JWT token to be used for KeyVault access.
internal async static Task<string> GetToken(string authority, string resource, string scope)
{
var authContext = new AuthenticationContext(authority);
// Could use pfx instead
ClientCredential clientCred = new ClientCredential(
ConfigurationManager.AppSettings["clientId"],
ConfigurationManager.AppSettings["clientSecret"]);
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);
if (result == null)
throw new InvalidOperationException("Failed to obtain the JWT token.");
return result.AccessToken;
}
}
Run Code Online (Sandbox Code Playgroud)
一旦有了KeyResolver,就可以获得一个IKey来包装/解包您的AES对称密钥,如下所示......
包裹/加密AES密钥
keyID是Key Vault的URI,aesKey是要加密的AES密钥的byte []:
// Resolve an IKey by Key ID from URI in KeyVault
var keyEncryptionKey = cloudResolver.ResolveKeyAsync(keyId, CancellationToken.None).GetAwaiter().GetResult();
// Take our gen'ed AES Key and wrap (encrypt) it.
Tuple<byte[], string> wrappedKey = keyEncryptionKey.WrapKeyAsync(aeskey, null /* algorithm */, CancellationToken.None).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)
元组中的byte []包含对称密钥的加密字节和所用算法的名称.使用密文将这些保存为元数据.
解包/解密AES密钥
使用相同的密钥调用(密钥版本很重要),algoName是用于包装密钥的算法的名称(例如"RSA-OAEP").
// Retrieve the IKey by Key ID
// Unwrap Key
byte[] aesKey = rsa.UnwrapKeyAsync(wrappedKeyBytes, algoName, CancellationToken.None).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)
要考虑的其他细节是密钥备份/恢复和密钥轮换.
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |