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

如何在Azure Function中使用Azure Key Vault的RSA-2048密钥加密大尺寸数据?

关于Azure Key Vault RSA密钥加密大数据的解决方案

首先直接给结论:你无法直接用RSA-2048密钥加密超过其最大明文长度的数据——这不是Azure Key Vault的限制,而是RSA非对称加密的固有设计:RSA的加密效率极低,且每个密钥长度对应固定的最大明文容量(比如2048位RSA用PKCS#1填充时,最大只能加密245字节左右的数据)。所以行业标准的解决方案就是你提到的混合加密方案:用对称密钥加密大数据,再用RSA密钥加密这个对称密钥。

下面我会详细解释流程,并给你适合Azure Function的C#代码示例,尽量简化密码学细节,让你能快速上手。

混合加密的核心流程

简单来说就是“对称加密数据,非对称加密对称密钥”:

  • 生成一个临时的对称密钥(比如AES-256,效率高、适合加密大文件/数据)
  • 用这个对称密钥加密你的大数据
  • 用Azure Key Vault中的RSA公钥加密这个对称密钥(因为对称密钥很小,远小于RSA的最大加密长度)
  • 最终你只需要保存/传输:加密后的对称密钥 + 加密后的数据 + 加密参数(比如AES的IV)
  • 解密时反向操作:先用RSA私钥解密出对称密钥,再用对称密钥解密数据

Azure Function中的代码示例(C#)

假设你已经配置好了Azure Function的Managed Identity,并且给该Identity分配了Key Vault的Key Encryption权限(用于加密对称密钥)。

首先需要安装NuGet包:

Install-Package Azure.Security.KeyVault.Keys
Install-Package Azure.Security.KeyVault.Keys.Cryptography
Install-Package System.Security.Cryptography.Xml

加密流程代码

using Azure.Security.KeyVault.Keys;
using Azure.Security.KeyVault.Keys.Cryptography;
using System.Security.Cryptography;
using System.Text;

public async Task<byte[]> EncryptLargeDataAsync(string keyVaultUrl, string keyName, byte[] largeData)
{
    // 1. 初始化Key Vault客户端和加密客户端
    var keyClient = new KeyClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    var key = await keyClient.GetKeyAsync(keyName);
    var cryptoClient = new CryptographyClient(key.Value.Id, new DefaultAzureCredential());

    // 2. 生成AES-256对称密钥和初始化向量(IV)
    using var aes = Aes.Create();
    aes.KeySize = 256;
    aes.GenerateKey();
    aes.GenerateIV();
    aes.Mode = CipherMode.CBC; // 常用模式,需要IV
    aes.Padding = PaddingMode.PKCS7;

    // 3. 用AES加密大数据
    using var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
    using var ms = new MemoryStream();
    using var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
    await cs.WriteAsync(largeData);
    cs.FlushFinalBlock();
    byte[] encryptedData = ms.ToArray();

    // 4. 用Key Vault的RSA密钥加密AES密钥
    var encryptResult = await cryptoClient.EncryptAsync(EncryptionAlgorithm.RsaOaep, aes.Key);
    byte[] encryptedAesKey = encryptResult.Ciphertext;

    // 5. 打包所有需要的信息:加密后的AES密钥 + IV + 加密后的数据
    // 这里我们用简单的拼接(实际项目可以用JSON/Protobuf序列化,更规范)
    using var resultMs = new MemoryStream();
    // 先写加密后的AES密钥长度和内容
    await resultMs.WriteAsync(BitConverter.GetBytes(encryptedAesKey.Length));
    await resultMs.WriteAsync(encryptedAesKey);
    // 再写IV长度和内容
    await resultMs.WriteAsync(BitConverter.GetBytes(aes.IV.Length));
    await resultMs.WriteAsync(aes.IV);
    // 最后写加密后的数据
    await resultMs.WriteAsync(encryptedData);

    return resultMs.ToArray();
}

解密流程代码(可选,供你参考)

public async Task<byte[]> DecryptLargeDataAsync(string keyVaultUrl, string keyName, byte[] encryptedPackage)
{
    var keyClient = new KeyClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    var key = await keyClient.GetKeyAsync(keyName);
    var cryptoClient = new CryptographyClient(key.Value.Id, new DefaultAzureCredential());

    using var ms = new MemoryStream(encryptedPackage);
    // 读取加密后的AES密钥
    byte[] aesKeyLenBytes = new byte[4];
    await ms.ReadAsync(aesKeyLenBytes);
    int aesKeyLen = BitConverter.ToInt32(aesKeyLenBytes);
    byte[] encryptedAesKey = new byte[aesKeyLen];
    await ms.ReadAsync(encryptedAesKey);

    // 读取IV
    byte[] ivLenBytes = new byte[4];
    await ms.ReadAsync(ivLenBytes);
    int ivLen = BitConverter.ToInt32(ivLenBytes);
    byte[] iv = new byte[ivLen];
    await ms.ReadAsync(iv);

    // 读取加密后的数据
    byte[] encryptedData = new byte[ms.Length - ms.Position];
    await ms.ReadAsync(encryptedData);

    // 用RSA私钥解密AES密钥
    var decryptResult = await cryptoClient.DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedAesKey);
    byte[] aesKey = decryptResult.Plaintext;

    // 用AES解密数据
    using var aes = Aes.Create();
    aes.Key = aesKey;
    aes.IV = iv;
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;

    using var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
    using var decryptMs = new MemoryStream();
    using var cs = new CryptoStream(decryptMs, decryptor, CryptoStreamMode.Write);
    await cs.WriteAsync(encryptedData);
    cs.FlushFinalBlock();

    return decryptMs.ToArray();
}

关键说明

  • 加密算法选择:示例中用了RsaOaep(比RsaPkcs1V1_5更安全)和AES-256-CBC,都是行业推荐的安全算法。
  • Managed Identity:示例用DefaultAzureCredential,会自动使用Function的Managed Identity访问Key Vault,不需要硬编码密钥,更安全。
  • 数据打包:示例用简单的字节拼接,实际项目建议用JSON或Protobuf序列化,方便解析和维护。
  • 权限配置:确保你的Function Identity在Key Vault的访问策略中拥有Key Encrypt和Key Decrypt权限(如果需要解密的话)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:39:05