PHP中生成AES密钥的正确方式是使用random_bytes()生成指定长度的密码学安全随机字节:AES-128需16字节、AES-192需24字节、AES-256需32字节;禁用md5、sha1、rand等非安全方法,避免openssl_random_pseudo_bytes()(已弃用)及硬编码、明文存储等风险操作。
PHP中生成AES密钥的正确方式
PHP本身不提供“创建对称加密密钥”的独立函数,密钥本质是一段随机字节数据。关键不是“创建”,而是**安全地生成指定长度的随机字节**,并确保与所选算法(如AES-128、AES-192、AES-256)严格匹配。
错误做法是用 md5()、sha1() 或 rand() 生成,它们不具备密码学安全性或长度不可控。
- 必须使用
random_bytes()—— PHP 7.0+ 内置的 CSPRNG 函数 - AES-128 需要 16 字节(
random_bytes(16)) - AES-192 需要 24 字节(
random_bytes(24)) - AES-256 需要 32 字节(
random_bytes(32)) - 生成后建议用
bin2hex()或base64_encode()存储/传输,但解密时必须还原为原始二进制
为什么不能用 openssl\_random\_pseudo\_bytes()?
openssl_random_pseudo_bytes() 在 PHP 7.0+ 已被标记为 deprecated,且其返回值需手动校验 $crypto_strong 参数,容易遗漏导致降级到弱随机源。
它和 random_bytes() 底层都调用系统 CSPRNG(如 Linux 的 /dev/urandom),但 random_bytes() 更直接、无歧义、无需额外判断。