Flutter+PHP+Node.js跨端聊天消息加解密防中间人攻击方案咨询
传输层中间人攻击防护
- 修复现有Node.js代码的不安全配置:你当前
send_to_db方法中自定义了checkServerIdentity且直接返回undefined,该配置会跳过HTTPS证书合法性校验,是中间人攻击的高危漏洞,直接删除该配置项即可,HTTPS会默认执行服务端证书校验,拦截伪造证书的中间人请求。 - Socket.io连接强制使用WSS协议:所有Flutter、Web端连接Socket.io时必须走WSS(WebSocket over TLS)协议,禁止使用明文WS协议,且前端连接时不要为了调试跳过证书校验,生产环境部署可信CA颁发的SSL证书,避免传输过程被窃听篡改。
端到端加解密方案(兼容多端)
选择AES-256-GCM对称加密算法作为统一加解密标准,该算法安全性高,且Flutter、Web、PHP三端都有成熟原生/第三方实现,可保证加密结果跨端一致。
- 密钥管理:不要将加密密钥硬编码在前端代码中,用户登录时通过HTTPS接口从PHP后端下发临时会话密钥,密钥可定期更换,降低泄露风险。
- 统一加密格式约定:所有端加密输出统一采用
base64(IV):base64(密文):base64(认证标签)的字符串格式,其中IV为12位随机值(每次加密都重新生成,不需要保密),认证标签为GCM模式下用于校验密文完整性的字段,避免密文被篡改。
业务流程改造
- 发送端(Flutter/Web):用户输入明文消息后,先按约定规则加密得到密文字符串,再将包含收发方ID、密文等字段的数据包通过Socket.io发送给Node.js服务
- Node.js服务:收到数据包后不需要解密,直接执行两个逻辑:一是将数据包转发给对应接收方的Socket连接;二是直接将数据包通过
send_to_db方法POST给PHP存入MySQL,全程Node.js不接触明文,即使服务被入侵也不会泄露消息内容 - 接收端(Flutter/Web):收到转发的数据包后,提取密文字段按约定规则解密得到明文,再展示给用户
- 历史消息拉取:PHP接口直接返回数据库存储的密文数据,由前端自行解密展示,不需要服务端参与解密操作
各端实现提示
- Flutter端可使用第三方
encrypt包实现AES-256-GCM加解密 - Web端可直接调用浏览器原生
Crypto API实现加解密,无需额外引入依赖 - PHP端可直接用内置openssl扩展的
openssl_encrypt、openssl_decrypt方法实现对应逻辑
内容的提问来源于stack exchange,提问作者Brightcode
相关产品推荐
相关产品推荐

