You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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算法,不再限制密码长度。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:30:07