问题背景
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
计划反编译后修改源码实现密码强度的增强校验
配置过程
本次使用到了如下一些工具:
- jdk8_131 crowd 的启动运行jdk
- jd-gui 反编译 class 文件为源码
- 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 的配置页面是可以设置密码复杂度正则的,后续可以测试下这里是否能控制住
评论