crowd密码强度提升
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

crowd密码强度提升

yuc
yuc
2024-11-28 / 最后修改: 2024-11-29 01:22 / 0 评论 / 4 阅读 / 正在检测是否收录...
问题背景

crowd 旧版本在修改密码的时候对密码强度要求不高,存在安全隐患,现研究如何提升 crowd 用户的密码强度策略

检查配置

查看了 crowd 后台配置,发现并没有跟密码相关的配置部分,那么只能想其他办法了

通过查看部署文件,发现可能通过修改代码的方式加强策略,具体找出了以下几个可能有关的文件:

crowd-webapp/WEB-INF/classes/com/atlassian/crowd/console/action/ChangeExpiredPassword.class
crowd-webapp/WEB-INF/classes/com/atlassian/crowd/console/action/ResetPassword.class
crowd-webapp/WEB-INF/classes/com/atlassian/crowd/console/action/user/ChangePassword.class

计划反编译后修改源码实现密码强度的增强校验

配置过程

本次使用到了如下一些工具:

  1. jdk8_131 crowd 的启动运行jdk
  2. jd-gui 反编译 class 文件为源码
  3. jet-brains idea 修改源码并且重新编译

使用上面的工具反编译后几个文件内都有如下代码,看起来用于密码的强度校验,所以可以从这里入手:

private void doValidation() {
  if (StringUtils.isBlank(this.password))
    addFieldError("password", getText("passwordempty.invalid")); 
  if (StringUtils.isBlank(this.confirmPassword)) {
    addFieldError("confirmpassword", getText("passwordempty.invalid"));
  } else if (!StringUtils.equals(this.password, this.confirmPassword)) {
    addFieldError("password", getText("passworddonotmatch.invalid"));
  }
}

修改为如下代码:

private void doValidation() {
  if (StringUtils.isBlank(this.password)) {
    addFieldError("password", getText("passwordempty.invalid"));
  } else {
    String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!#<>@$%^&*\\-_+=|;:,.<>?/]).{8,}$";
    if (!this.password.matches(regex))
      addFieldError("password", "密码包含大写字母、小写字母、数字、特殊字符@#./-_<>+=?!$%^&* ,并且不少于8位");
  } 
  if (StringUtils.isBlank(this.confirmPassword)) {
    addFieldError("confirmpassword", getText("passwordempty.invalid"));
  } else if (!StringUtils.equals(this.password, this.confirmPassword)) {
    addFieldError("password", getText("passworddonotmatch.invalid"));
  }
}

上面修改后的代码强度策略为:最少一个大写、一个小写、一个数字、一个特殊字符。但特殊字符只是尽量扩展了,并没有完全包括所有的字符,目前单文件强度测试是符合预期的

应用测试

在重新编译生成 class 后替换原环境,分别测试在管理员后台修改密码、在普通用户后台修改、过期修改、忘记密码、邮件重置 等都测试成功

使用如下代码可在 vscode 运行测试效果

public class PasswordValidator {
    public static void main(String[] args) {
        // 测试密码
        String password = "1Password."; // 测试密码可以修改
        // 
        // 调用验证密码的方法
        if (!isValidPassword(password)) {
            System.out.println("密码需包含大写字母、小写字母、数字、特殊字符@#./-_<>+=?!$%^&* ,并且不少于8位");
        } else {
            System.out.println("密码验证通过!");
        }
    }
    // 密码验证方法
    public static boolean isValidPassword(String password) {
        // 密码的正则表达式
        // String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"; // old
        String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!#<>@$%^&*\\-_+=|;:,.<>?/]).{8,}$"; // new
        // 使用正则表达式进行匹配验证
        return password.matches(regex);
    }
}
20241125

在研究 crowd 新增 directory 的时候,发现 directory 的配置页面是可以设置密码复杂度正则的,后续可以测试下这里是否能控制住

0

评论

博主关闭了当前页面的评论