Sie die Technik verwenden, die Azure BLOB-Speicher verwendet, um Daten in Ruhe verschlüsselt (envelope-Methode): https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption
KeyVault hat die Fähigkeit zu Wrap/Unwrap (Verschlüsselung/Entschlüsselung) symmetrische Schlüssel, so dass sie sicher sind für Sie zusammen mit Ihren verschlüsselten Daten speichern.
Hier sind die allgemeinen Schritte:
- Generaete ein AES-Schlüssel (256 Bit, CBC-Modus) RNGCryptoServiceProvider
- verschlüsseln die Daten (Credentials)
- Speichern der Initialisierungsvektor (IV) verwendet wird. Sie können es einfach zum Ciphertext-Byte-Array übertragen, um es später zu entschlüsseln, wenn Sie es entschlüsseln wollen - IV muss nicht geschützt werden.
- Den generierten symmetrischen AES-Schlüssel mithilfe des Schlüssels in KeyVault umschließen (verschlüsseln).
- Gespeicherte AES-Schlüssel, IV, CipherText und Schlüsselversion (GUID am Ende des URI in KeyVault) speichern.
- Stellen Sie sicher, dass Sie die Wrap/Unwrap-Berechtigungen in KeyVault der in Azure AD erstellten Anwendungsregistrierung gewähren. Verwenden Sie die Client-ID/Anwendungs-ID + Schlüssel oder pfx, um Azure in GetToken() zu authentifizieren.
Sie werden diese nuget Pakete müssen:
Install-Package Microsoft.Azure.KeyVault
Install-Package Microsoft.Azure.KeyVault.Extensions
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.16.204221202
ein ref Holen zu 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;
}
}
Sobald Sie KeyResolver haben, können Sie ein IKey erhalten Wrap/Unwrap Ihre AES symmetrischer Schlüssel wie folgt ...
Wrap/Encrypt AES Schlüssel
Die Schlüssel-ID ist die URI von Key Vault und aesKey ist die byte [] Ihren Schlüssels AES zu verschlüsseln:
// 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();
Das byte [] in dem Tuple das verschlüsselte Bytes des symmetrischen Schlüssels enthält und die Name des verwendeten Algorithmus. Speichern Sie diese als Metadaten mit Ihrem Geheimtext.
Abwickelwerkzeug/Entschlüsseln AES-Schlüssel
Rufen Sie den gleichen Schlüssel (Key Version Angelegenheiten) verwendet wird, ist algoName der Name des Algorithmus verwendet, um den Schlüssel zu umwickeln (zum Beispiel "RSA-OAEP").
// Retrieve the IKey by Key ID
// Unwrap Key
byte[] aesKey = rsa.UnwrapKeyAsync(wrappedKeyBytes, algoName, CancellationToken.None).GetAwaiter().GetResult();
Weitere Details, über die Sie nachdenken sollten, sind die Schlüsselsicherung/-wiederherstellung und Schlüsselrotation.
Nur neugierig, ist das 'Dienstkonto', über das Sie sprechen, für das Verwalten des Azure-Abonnements des Benutzers in ihrem Namen? –
Nein @GauravMantri. Dies sind die Anmeldeinformationen für das Dynamics CRM-Dienstkonto. Das Konto wird verwendet, um Entitäten in Dynamics CRM über eine Daemon-App zu aktualisieren. Btw, Gute Arbeit dort auf Blogs und Artikeln, ich folge deinen Blogs ;-) –
Benutzername und Passwort des Dienstkontos werden vom Administrator eingegeben, was bringt es also, sie wieder in azurblauen Schlüsseltresor einzutragen? –