密码存储原理
织梦CMS的管理员密码存储在 dede_admin 表的 pwd 字段中,使用 MD5 加密。需要注意的是,织梦并非直接对明文做 MD5,而是先把密码末尾拼接一段名为 cryptographic 的密钥(保存在 data/config.cache.inc.php 中的 $cfg_cookie_encode),再做 MD5 散列。因此直接写 md5('123456') 是登录不上的,必须拼接密钥。
原因分析
1. 长时间未登录忘记密码
站长长期不进后台,新员工交接时密码遗失,需要快速恢复。
2. 密码被恶意篡改
站点被黑后 admin 密码被改写,导致原账号无法登录。
3. cookie_encode 丢失
迁移服务器时漏拷 data/config.cache.inc.php,原密码 hash 全部失效。
重置方法
方法一:phpMyAdmin 直接改表
- 登录宝塔或 phpMyAdmin,找到
dede_admin表。 - 编辑 admin 这一行,将
pwd字段值改为:f297a57a5a743894a0e4这串值对应明文
admin,是织梦默认密钥下的标准 MD5。 - 保存后用账号
admin、密码admin登录后台。 - 进入「系统 → 用户管理 → 修改密码」重新设置强密码。
方法二:上传 radminpass.php 工具
织梦官方提供了一个一键重置脚本 radminpass.php,上传到网站根目录后浏览器访问,按提示输入新密码即可。操作完毕务必删除该文件。
方法三:自写脚本重置
新建 reset.php 放到根目录,内容如下:
<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
$pwd='admin123';
$key=$cfg_cookie_encode;
$hash=md5($pwd.$key);
$dsql->ExecuteNoneQuery("UPDATE `dede_admin` SET pwd='{$hash}' WHERE userid='admin'");
echo 'reset done, new password: '.$pwd;
?>
访问后立即删除该文件。
配置示例
如果通过 SQL 命令行操作,可以执行:
UPDATE dede_admin SET pwd=MD5(CONCAT('admin123', '你的cfg_cookie_encode值')) WHERE userid='admin';
查看密钥的方法:打开 data/config.cache.inc.php,搜索 $cfg_cookie_encode。
注意事项
radminpass.php、reset.php等脚本必须即用即删,否则会被黑客用来反复重置密码。- 密码重置后第一时间修改
cfg_cookie_encode,让旧 hash 失效。 - 不要把新密码设置为
admin、123456等弱口令,建议 12 位以上含大小写数字符号。 - 如果站点被入侵过,重置密码后必须全站查杀 webshell,修改数据库账号密码与 FTP 密码。
建议把后台登录地址从默认
/dede/ 改为随机字符串目录,提升安全等级。建议与展望
密码重置只是应急手段,更重要的是建立密码管理机制。建议把后台账号密码统一存到密码管理器(如 1Password、Bitwarden)中,避免遗忘;为后台启用 IP 白名单或 BasicAuth 二次验证,即使密码泄露也能挡住大部分暴力破解。如果团队多人协作,应通过「用户组管理」分配最小权限账号,主 admin 仅由核心运维掌握。今天就先把密码改强、把脚本删干净,给站点加一道安全保险。