chpasswd.cgi网页改密码失效:密码长度超8字符无法生效
chpasswd.cgi超长密码无法生效的解决办法
你的问题核心是老式crypt()函数依赖DES加密,仅支持前8位密码。要解决这个问题,需要从cgi脚本加密逻辑和系统密码策略两方面入手:
1. 修改chpasswd.cgi的加密实现
打开你的chpasswd.cgi源码,定位到调用crypt()的代码段:
- 老式调用仅传入密码,默认用DES加密:
crypt(password, salt)(这里的salt可能未指定加密前缀) - 要支持长密码,必须指定现代加密算法的salt前缀:
- SHA-512(推荐,安全性最高):前缀为
$6$ - SHA-256:
$5$ - MD5:
$1$
示例C代码修改:
这样// 生成带SHA-512前缀的随机salt char salt[30]; snprintf(salt, sizeof(salt), "$6$%s$", generate_random_string(16)); // 生成16位随机串作为salt char *encrypted_pass = crypt(user_password, salt);crypt()会使用SHA-512算法,不再限制密码长度。 - SHA-512(推荐,安全性最高):前缀为
2. 确认系统PAM密码配置
别忽略/etc/pam.d/common-password,它直接控制系统密码的加密规则。找到pam_unix.so的配置行,确保启用了现代加密算法:
password [success=1 default=ignore] pam_unix.so sha512 shadow nullok
这里的sha512参数指定系统默认用SHA-512存储密码,必须和cgi脚本的加密逻辑匹配,否则修改后的密码无法被系统识别。
3. 批量迁移密码的实操建议
针对2000+密码的迁移场景:
- 先测试单个长密码修改:修改cgi后,手动提交一个长密码,查看
/etc/shadow中对应用户的密码字段是否以$6$(或你指定的前缀)开头,而非老式的13字符DES加密串。 - 批量处理:可以编写脚本批量调用修改后的chpasswd.cgi接口,或者直接生成符合格式的加密密码,通过
chpasswd命令批量更新(注意chpasswd默认也可能用DES,需加-e参数指定加密方式,或确保系统默认加密策略正确)。
重要提醒:修改密码相关配置前,务必备份/etc/passwd和/etc/shadow文件,防止操作失误导致系统无法登录。
内容的提问来源于stack exchange,提问作者Renobr
相关产品推荐
相关产品推荐

