Вы можете использовать метод, который использует для хранения Azure Blob для шифрования данных в состоянии покоя (метод огибающего): https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption
KeyVault имеет возможность Wrap/Unwrap (шифрование/дешифрование) симметричные ключи, чтобы они являются безопасными для вы должны хранить вместе с вашими зашифрованными данными.
Вот общие шаги:
- Generaete ключ AES (256 бит, режим CBC) с помощью RNGCryptoServiceProvider
- шифровать данные (учетные данные)
- Сохраните вектор инициализации (IV). Вы можете просто конкатенировать его с байтовым массивом зашифрованного текста для последующего поиска, когда вы хотите расшифровать - IV не нуждается в защите.
- Оберните (зашифруйте) генетический симметричный ключ AES с помощью клавиши KeyVault.
- Магазин Wraped AES Key, IV, CipherText и Key Version (GUID в конце URI в KeyVault).
- Убедитесь, что вы предоставили разрешения Wrap/Unwrap в KeyVault для регистрации приложений, созданных в Azure AD. Используйте идентификатор клиента/идентификатор приложения + ключ или pfx для авторизации до Azure в GetToken().
Вам нужны эти NuGet пакеты:
Install-Package Microsoft.Azure.KeyVault
Install-Package Microsoft.Azure.KeyVault.Extensions
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.16.204221202
Получить реф в 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;
}
}
После того как вы есть KeyResolver, вы можете получить Айки обернуть/Берем ваш AES симметричный ключ следующим образом:
Wrap/Encrypt AES Key
идентификатор ключа является URI от Key Vault и aesKey является байт [] вашего ключа AES для шифрования:
// 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();
байт [] в кортеже содержит зашифрованные байты симметричного ключа и имя используемого алгоритма. Сохраните их как метаданные с вашим зашифрованным текстом.
Unwrap/дешифрования AES ключ
вызова, используя тот же ключ (ключевые дела, версия), algoName это название алгоритма, используемого для обертывания ключа (например, "RSA-OAEP").
// Retrieve the IKey by Key ID
// Unwrap Key
byte[] aesKey = rsa.UnwrapKeyAsync(wrappedKeyBytes, algoName, CancellationToken.None).GetAwaiter().GetResult();
Другие сведения, которые следует учитывать, это резервное копирование/восстановление ключей и поворот ключа.
Любопытно, что «учетная запись службы», о которой вы говорите, предназначена для управления подпиской Azure от их имени? –
Nope @GauravMantri. Это будут учетные данные для учетной записи службы Dynamics CRM. Учетная запись будет использоваться для обновления объектов в Dynamics CRM через приложение-демон. Кстати, хорошая работа там в блогах и статьях, я слежу за вашими блогами ;-) –
Имя учетной записи пользователя и пароль будут введены администратором, так что же нужно добавить их снова в хранилище ключей в лазурном ключе? –