You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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属于非对称加密算法,每个密钥版本对应一对完全独立的公钥/私钥。用旧版本密钥加密的数据,只能用同一版本的私钥解密,新版本密钥是全新的密钥对,和旧版本没有关联,因此无法解密旧加密数据。

解决步骤

  1. 保留加密时的密钥版本信息
    加密数据时,必须将使用的密钥版本与密文绑定存储——比如在密文前拼接版本标识,或者单独存入数据库的对应字段,确保解密时能定位到正确的密钥版本。

  2. 使用旧版本密钥解密旧数据
    解密旧数据时,需要根据存储的版本号获取对应版本的密钥实例,再执行解密操作。示例代码如下:

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);
  1. 密钥轮换场景的适配
    如果需要切换到新版本密钥加密新数据,同时兼容旧数据解密:
    • 新数据用新版本密钥加密,并存入对应的版本号
    • 旧数据解密时仍使用对应的旧版本密钥
    • 若希望统一用新版本密钥处理所有数据,需要先批量将旧数据用旧密钥解密,再用新密钥重新加密后存储。

内容的提问来源于stack exchange,提问作者user20789569

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:25:21