$cfg['blowfish_secret']必须≥32字节,因OpenSSL底层要求AES-256密钥严格为32字节,短则openssl_encrypt返回false导致加密失败;该变量须置于所有$cfg['Servers']配置之前,且仅在auth_type='cookie'时生效,生成应使用openssl rand -base64 24或bin2hex(random_bytes(16))。
为什么$cfg['blowfish_secret']必须≥32字节
不是 phpmyadmin 故意设门槛,是 openssl 底层对 aes-256-cbc 的硬性要求:密钥必须严格为 32 字节(256 位)。phpmyadmin 5.2+ 完全依赖 openssl_encrypt() 做 cookie 加密,传入短于 32 字节的字符串时,函数直接返回 false,不报错、不补零、不 fallback —— 加密链当场断裂。
常见错误现象:
- 页面底部持续显示“配置文件现在需要一个短语密码”
- 输入账号密码后 HTTP 302 跳回登录页,DevTools 看不到
pmaAuth-*cookie - Apache/Nginx 和 PHP 错误日志全空,因为失败发生在加密初始化阶段,早于日志记录时机
$cfg['blowfish_secret']写在哪才生效
位置错了等于没写。phpMyAdmin 初始化时只在极早期读一次该变量,且必须在任何 $cfg['Servers'] 配置之前。
正确顺序示例:
$cfg['blowfish_secret'] = 'abcdefghijklmnopqrstuvwxyzabcdefgh'; // 必须在这行 $i = 0; $i++; $cfg['Servers'][$i]['host'] = 'localhost'; $cfg['Servers'][$i]['auth_type'] = 'cookie';
容易踩的坑:
立即学习“PHP免费学习笔记(深入)”;
- 写在
$i++之后、或$cfg['Servers'][$i]块内部 —— 读不到 - 放在注释块里、被
/* */包裹、文件开头有 UTF-8 BOM —— BOM 会被计入长度,导致实际只有 30 字符 - 密钥含中文、空格、
$、\等特殊字符 —— 可能触发解析异常或截断
怎么生成合规的 32 字符密钥
别手敲,也别用 123456 这类弱密钥。真实可用的生成方式只有两种:
- 终端执行:
openssl rand -base64 24 | tr -d '\n' | cut -c1-32(注意去换行再截取) - PHP 中运行:
bin2hex(random_bytes(16))得到 32 字符十六进制串,已满足长度且无特殊字符
生成后直接赋值给 $cfg['blowfish_secret'] 即可,不需要额外处理。
改完为什么还报错
最常被忽略的两个条件:
-
$cfg['Servers'][$i]['auth_type']必须明确设为'cookie'—— 如果是'config'或'http',这个密钥根本不会被加载 - 浏览器里残留旧 cookie,会导致新密钥解不开旧加密数据,表现为登录后立刻登出;必须手动清空所有
pmaAuth-相关 cookie 才能生效
Web 服务本身不用重启,但配置文件修改后,旧会话状态彻底失效是必然结果 —— 这不是 bug,是加密设计的正常表现。



















