PHP参数加密需结合HTTPS+POST防窃取,AES-256-GCM对称加密防篡改,RSA非对称加密适配不可信前端,再叠加HMAC签名、时间戳和nonce防重放,密钥须环境变量管理、IV每次随机生成。

PHP参数传递加密不是简单地“把字符串变乱”,而是要结合传输场景、安全等级和系统架构,选择合适的方式防止参数被窃取、篡改或重放。核心原则是:敏感参数不走GET、不裸露、不硬编码密钥、每次请求有校验。
优先用HTTPS + POST替代明文GET传参
这是最基础也最关键的一步。很多所谓“加密”问题,其实源于把密码、token、用户ID等直接拼在URL里(如?id=123&token=abc),这类参数极易被浏览器历史、代理日志、CDN缓存、Referer头泄露。
- 所有含敏感信息的接口,强制使用POST方法提交,数据放在请求体中
- 服务端必须启用HTTPS,并配置HTTP Strict Transport Security(HSTS)头
- 禁用HTTP明文跳转,避免中间人劫持导致证书绕过
对称加密:适合可信系统间参数保护
当参数需在前后端或微服务之间传递(比如ThinkPHP的U方法生成链接、API网关透传参数),可用AES类对称加密。关键点在于密钥管理和IV处理。
- 选用AES-256-CBC或更安全的AES-256-GCM(带认证,防篡改)
- 密钥绝不写死在代码里,从环境变量读取:getenv('APP_ENCRYPT_KEY')
- 每次加密都用openssl_random_pseudo_bytes()生成新IV,与密文拼接后base64编码传输
- 解密时先分离IV和密文,再调用openssl_decrypt();失败时返回统一错误,不暴露解密细节
非对称加密:适用于跨域或不可信前端传参
如果参数由第三方页面(如H5、小程序)发起,且你无法控制其运行环境,可让前端用你的公钥加密,后端用私钥解密。典型用于登录凭证、一次性授权码等小数据。
立即学习“PHP免费学习笔记(深入)”;
- 用OpenSSL命令生成RSA密钥对:openssl genrsa -out private.pem 2048,再导出公钥
- 前端JS可用jsencrypt库,用公钥加密参数;PHP后端用openssl_private_decrypt()解密
- 注意RSA只适合加密短数据(如200字节以内),长内容建议“RSA加密AES密钥 + AES加密实际参数”混合方案
- 私钥文件必须设为仅Web服务器可读(chmod 600),严禁上传到Git或公开目录
加签+时效性:防重放与篡改的必备补充
单纯加密不能防止请求被截获后重复提交(重放攻击),也不能验证数据是否中途被修改。必须配合签名和时间戳。
- 客户端按约定顺序拼接参数(如id=100&ts=1724752320&nonce=abc123),再用密钥做HMAC-SHA256签名:hash_hmac('sha256', $str, $secret)
- 请求带上sign、ts(时间戳)、nonce(一次随机串)三个字段
- 服务端校验:ts是否在5分钟内、nonce是否未被使用过(Redis缓存已用列表)、sign是否匹配
- 即使参数被加密,没签名和时效控制,依然可能被重放利用



















