如何在PHP中解密Flutter encrypt包生成的AES加密数据
问题解答
一、现有加密内容的PHP解密方法
你当前Flutter使用的加密包默认AES配置为 AES-256-CBC模式 + PKCS7填充,且现有代码中Key.fromLength(32)、IV.fromLength(16)会生成对应长度的全0字节序列,PHP侧可直接通过openssl扩展解密,代码如下:
<?php // 若后续替换为自定义密钥IV,直接修改对应值即可 $defaultKey = str_repeat("\0", 32); $defaultIv = str_repeat("\0", 16); function decryptFlutterAes(string $encryptedBase64, string $key = $defaultKey, string $iv = $defaultIv): string|false { return openssl_decrypt( $encryptedBase64, 'AES-256-CBC', $key, 0, $iv ); } // 调用示例 $encryptedStr = "数据库中存储的加密base64字符串"; $plainText = decryptFlutterAes($encryptedStr); ?>
注意:当前Flutter代码的密钥和IV为固定全0,无安全防护能力,仅可用于测试,生产环境必须替换为随机生成的保密密钥。
二、跨端加解密推荐方案
以下两种方案都可同时在Flutter和PHP中无缝实现,安全性和适配性都优于你当前的实现:
- AES-GCM模式:属于认证加密模式,自带数据完整性校验,不需要额外处理校验逻辑,Flutter加密包和PHP openssl扩展均原生支持。实现时只需两端对齐规则:每次加密生成12字节随机IV,加密后将IV、密文、认证标签拼接后转base64存储,解密时先拆分对应字段再解密即可。
- libsodium库:PHP7.2+原生集成sodium扩展,Flutter也有对应的sodium封装库,内置XChaCha20-Poly1305等安全算法,API设计统一,不需要自行处理填充、IV长度等容易出错的细节,安全冗余度更高,更适合跨端业务场景。
跨端加解密通用对齐要求:两端的密钥长度、算法模式、填充规则、IV长度、编码格式必须完全一致,密钥禁止硬编码在客户端代码中,需做安全存储。
内容的提问来源于stack exchange,提问作者Brightcode
相关产品推荐
相关产品推荐

