【问题标题】:Using Key by Azure Key Vault to Encrypt and Decrypt text使用 Azure Key Vault 的 Key 加密和解密文本
【发布时间】:2020-06-03 12:26:40
【问题描述】:

我正在尝试使用 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;
        }
    }

我正在使用该代码从密钥中获取我的 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();
        }

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

System.Security.Cryptography.CryptographicException: 'Error decoding OAEP padding.'

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

key.ToRSA(true);

但是 a 得到了那个错误:

所以,我不知道如何完成这个过程。还有其他方法吗?或者怎么了?

【问题讨论】:

    标签: c# azure encryption rsa azure-keyvault


    【解决方案1】:

    如果你想使用 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
    
    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);
    

    【讨论】:

    • @CaioSilvac 对不起,我听不懂。能详细描述一下吗?
    • 我正在尝试使用它来加密和解密来自 Web API 的 cookie。所以,我需要在本地加密和解密我的值。每次我需要解密时,我都无法发出请求(使用 Decrypt Async)。
    • @CaioSilva 出于安全考虑,微软不允许用户以任何方式获取 Azure key vault key 的私钥。更多详情请参考docs.microsoft.com/en-us/azure/key-vault/keys/…。所以我们不能在本地做解密动作。如果您只想在本地执行这些操作,我建议您在本地创建 RSA 密钥然后执行这些操作。
    • 执行此操作需要什么权限? Key Vault 加密用户?
    • 我从哪里得到这些:clientId, // 您的 AD 应用程序 appId clientSecret // 您的 AD 应用程序应用程序密码。我只有 Vault 访问权限,它由多个应用程序共享
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2018-12-08
      • 1970-01-01
      • 2016-07-02
      • 2021-12-13
      • 2017-09-12
      • 2021-11-28
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多