使用 Azure Key Vault 的密钥加密和解密文本

0 c# encryption rsa azure azure-keyvault

我正在尝试使用 Azure Key Vault 中的密钥来加密和解密 Web API 的 cookie。

对于加密过程,我在该类中使用 RSA:

    public class SimpleRSA
    {
        private RSA _rsa;

        public SimpleRSA(RSA rsa)
        {
            _rsa = rsa;
        }

        public string EncryptAsync(string value)
        {
            var byteData = Encoding.Unicode.GetBytes(value);
            var encryptedText = _rsa.Encrypt(byteData, RSAEncryptionPadding.OaepSHA1);
            var encodedText = Convert.ToBase64String(encryptedText);
            return encodedText;
        }


        public string DecryptAsync(string encryptedText)
        {
            var encryptedBytes = Convert.FromBase64String(encryptedText);
            var decryptionResult = _rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA1);
            var decryptedText = Encoding.Unicode.GetString(decryptionResult);
            return decryptedText;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我使用该代码从密钥中获取 RSA:

  public RSA GetRSA(string appId, string appSecret)
        {
            AuthenticationCallback callback = async (authority, resource, scope) =>
            {
                var authContext = new AuthenticationContext(authority);

                var credential = new ClientCredential(appId, appSecret);
                var authResult = await authContext.AcquireTokenAsync(resource, credential);
                return authResult.AccessToken;
            };

            var client = new KeyVaultClient(callback);

            var result = client.GetKeyAsync(_vaultBaseUrl, _keyId).Result;
            var key = result.Key;

            return key.ToRSA();
        }
Run Code Online (Sandbox Code Playgroud)

我从 Azure Key Vault 获取了 RSA,并成功加密了我的字符串。问题是当我尝试解密该值时。在这个过程中我得到了这个错误:

System.Security.Cryptography.CryptographicException: 'Error decoding OAEP padding.'
Run Code Online (Sandbox Code Playgroud)

我认为这种情况可能会发生,因为我没有 RSA 中的私钥,但我尝试使用此方法来获取带有私钥的 RSA::

key.ToRSA(true);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是出现了这个错误:

在此输入图像描述

所以,我不知道如何完成这个过程。还有其他方法可以做到这一点吗?或者出了什么问题?

Jim*_* Xu 7

如果您想使用Azure Key Vault来加密和解密文本,可以使用SDKAzure.Security.KeyVault.Keys来实现。

例如

  1. 安装SDK
Install-Package Azure.Security.KeyVault.Keys -Version 4.0.3
Install-Package Azure.Identity -Version 1.1.1
Run Code Online (Sandbox Code Playgroud)
  1. 代码
          ClientSecretCredential clientSecretCredential = new ClientSecretCredential(tenantId, // your tenant id
                           clientId, // your AD application appId
                           clientSecret // your AD application app secret
                       );

            //get key
            var KeyVaultName = "<your kay vault name>";
            KeyClient keyClient = new KeyClient(new Uri($"https://{KeyVaultName}.vault.azure.net/"), clientSecretCredential);;
            var keyName="<your key name>"
            var key = await keyClient.GetKeyAsync(keyName);

            // create CryptographyClient
            CryptographyClient cryptoClient = new CryptographyClient(key.Value.Id, clientSecretCredential);

            var str ="test"
            Console.WriteLine("The String used to be encrypted is :  " +str );

            Console.WriteLine("-------------encrypt---------------");
            var byteData = Encoding.Unicode.GetBytes(str);
            var encryptResult = await cryptoClient.EncryptAsync(EncryptionAlgorithm.RsaOaep, byteData);
            var encodedText = Convert.ToBase64String(encryptResult.Ciphertext);
            Console.WriteLine(encodedText);

            Console.WriteLine("-------------dencrypt---------------");
            var encryptedBytes = Convert.FromBase64String(encodedText);
            var dencryptResult = await cryptoClient.DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedBytes);
            var decryptedText = Encoding.Unicode.GetString(dencryptResult.Plaintext);
            Console.WriteLine(decryptedText);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 5

Key Vault 可以存储三种项目类型:密钥、机密和证书。密钥始终是不对称的 - RSA 或椭圆曲线,并且私钥不会离开 KV。您需要的是使用对称密钥,但您需要将其存储为 Secret,而不是密钥。

因此,在 KV 中存储一个 256 位随机密钥,将其命名为 MyCoolCryptoKey,将该对称密钥提取到 C# 代码中,并将其用作 AES 的密钥。