Azure Function App RabbitMQTrigger AES加密消息解密失败求助
Azure Function RabbitMQ触发器AES加密消息解密失败解决
问题背景
- 使用Azure Function的RabbitMQ触发器监听外部队列,触发正常,但接收到的是乱码二进制内容,并非Base64格式
- 原代码用
string类型接收消息,执行Convert.FromBase64String时触发非法字符错误 - 尝试将乱码字符串转UTF8再转Base64后,解密时出现"The input data is not a complete block"错误
核心问题
RabbitMQ中传递的是原始二进制加密数据,用string类型接收会导致二进制字节被错误编码为UTF-8字符串,破坏了原始加密字节流,后续的转码操作无法恢复正确的加密数据。
解决方案步骤
1. 修改触发器参数类型,直接接收二进制数据
将RabbitMQ触发器的参数从string改为byte[],避免编码损失:
[FunctionName("RabbitMQTriggerTest")] public async Task Run([RabbitMQTrigger("event-vendor-create", ConnectionStringSetting = "RabbitMQConnection")] byte[] item , [DurableClient] IDurableOrchestrationClient starter, ILogger log) { string decryptedText = AesDecryptHelper.DecryptAes(item, _options.RabbitMQAesKey); log.LogInformation($"Decrypted Text: {decryptedText}"); }
2. 调整解密方法,适配二进制输入
修改解密方法,直接接收byte[]类型的加密数据,不再做Base64转换:
public static string DecryptAes(byte[] encryptedBytes, string aesKey) { // 转换Base64格式的AES密钥为字节数组 byte[] keyBytes = Convert.FromBase64String(aesKey); using (Aes aesAlg = Aes.Create()) { aesAlg.Key = keyBytes; aesAlg.Mode = CipherMode.CBC; aesAlg.Padding = PaddingMode.PKCS7; // 验证加密数据长度是否足够容纳IV int ivSize = aesAlg.BlockSize / 8; if (encryptedBytes.Length < ivSize) { throw new ArgumentException("加密数据过短,无法提取IV"); } // 提取前置在加密数据中的IV byte[] iv = new byte[ivSize]; Array.Copy(encryptedBytes, 0, iv, 0, ivSize); aesAlg.IV = iv; using (ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)) { // 从IV之后的位置开始解密 using (MemoryStream msDecrypt = new MemoryStream(encryptedBytes, ivSize, encryptedBytes.Length - ivSize)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } } }
3. 关键验证点
- 密钥一致性:确认AES密钥和发送方完全一致,且是Base64编码格式,长度符合AES要求(128位对应24个Base64字符,256位对应44个)
- IV传递方式:确认发送方是否确实将IV前置在加密数据前,若IV通过其他方式传递(如RabbitMQ消息Header),需调整IV提取逻辑
- 加密参数匹配:确认发送方使用的
CipherMode、PaddingMode与你的代码完全一致,比如是否是CBC/PKCS7,若发送方用了ECB或ZeroPadding,需同步修改 - 数据完整性:检查接收的加密字节长度,确保没有在传递过程中丢失字节(密文长度需是AES块大小的整数倍,即16字节的倍数)
内容的提问来源于stack exchange,提问作者OutlawsGalaxy
相关产品推荐
相关产品推荐

