Azure Key Vault新版本密钥无法解密旧加密数据问题求助
问题:Azure Key Vault更换密钥版本后无法解密旧加密数据
使用Azure Key Vault Client和Cryptography Client进行数据加密操作正常,但更换密钥版本后,用新版本密钥解密原有加密数据时失败。相关代码如下:
var keyName = "bcdfed"; var keyVaultUrl = "https://abcd.vault.azure.net"; var token = new DefaultAzureCredential(); var keyClient = new KeyClient(new Uri(keyVaultUrl), token); var azureKey = await keyClient.GetKeyAsync(keyName); var cryptographyClient = keyClient .GetCryptographyClient(azureKey.Value.Name, azureKey.Value.Properties.Version); var inputValue = "input some value"; byte[] input = Encoding.UTF8.GetBytes(inputValue); var encryptionResult = await cryptographyClient .EncryptAsync(EncryptionAlgorithm.RsaOaep, input); var encryptedString = Convert.ToBase64String(encryptionResult.Ciphertext); byte[] encryptedResultByte = Convert.FromBase64String(encryptedString); await cryptographyClient .DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedResultByte);
解决方案
核心原因
RSA属于非对称加密算法,每个密钥版本对应一对完全独立的公钥/私钥。用旧版本密钥加密的数据,只能用同一版本的私钥解密,新版本密钥是全新的密钥对,和旧版本没有关联,因此无法解密旧加密数据。
解决步骤
保留加密时的密钥版本信息
加密数据时,必须将使用的密钥版本与密文绑定存储——比如在密文前拼接版本标识,或者单独存入数据库的对应字段,确保解密时能定位到正确的密钥版本。使用旧版本密钥解密旧数据
解密旧数据时,需要根据存储的版本号获取对应版本的密钥实例,再执行解密操作。示例代码如下:
var keyName = "bcdfed"; var keyVaultUrl = "https://abcd.vault.azure.net"; var token = new DefaultAzureCredential(); var keyClient = new KeyClient(new Uri(keyVaultUrl), token); // 从存储中取出加密时使用的旧密钥版本号 var oldKeyVersion = "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // 获取旧版本密钥 var oldAzureKey = await keyClient.GetKeyAsync(keyName, oldKeyVersion); // 创建对应旧版本的CryptographyClient var oldCryptographyClient = keyClient.GetCryptographyClient(oldAzureKey.Value.Name, oldAzureKey.Value.Properties.Version); // 待解密的密文 byte[] encryptedResultByte = Convert.FromBase64String(encryptedString); // 用旧版本密钥解密 var decryptionResult = await oldCryptographyClient.DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedResultByte); var decryptedValue = Encoding.UTF8.GetString(decryptionResult.Plaintext);
- 密钥轮换场景的适配
如果需要切换到新版本密钥加密新数据,同时兼容旧数据解密:- 新数据用新版本密钥加密,并存入对应的版本号
- 旧数据解密时仍使用对应的旧版本密钥
- 若希望统一用新版本密钥处理所有数据,需要先批量将旧数据用旧密钥解密,再用新密钥重新加密后存储。
内容的提问来源于stack exchange,提问作者user20789569
相关产品推荐
相关产品推荐

