插件窝 干货文章 如何用JavaScript代码校验密码,避免连续或重复字符?

如何用JavaScript代码校验密码,避免连续或重复字符?

password 密码 字符 message 119    来源:    2025-03-26

JavaScript密码校验:避免连续或重复字符

在密码校验中,防止连续或重复字符是一个常见的安全要求。下面我将介绍几种JavaScript实现方法。

方法一:正则表达式校验

function validatePassword(password) {
    // 检查连续字符 (如123, abc)
    const sequentialRegex = /(012|123|234|345|456|567|678|789|890|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)/i;

    // 检查重复字符 (如111, aaa)
    const repeatRegex = /(.)\1{2,}/;

    // 检查键盘相邻字符 (如qwe, asd)
    const keyboardRegex = /(qwerty|asdfgh|zxcvbn|poiuyt|lkjhgf|mnbvcx)/i;

    if (sequentialRegex.test(password)) {
        return { valid: false, message: "密码包含连续字符" };
    }

    if (repeatRegex.test(password)) {
        return { valid: false, message: "密码包含重复字符" };
    }

    if (keyboardRegex.test(password)) {
        return { valid: false, message: "密码包含键盘相邻字符" };
    }

    return { valid: true, message: "密码有效" };
}

方法二:算法校验(更全面)

function isPasswordValid(password) {
    // 最小长度检查
    if (password.length < 8) {
        return { valid: false, message: "密码至少需要8个字符" };
    }

    // 检查连续字符
    for (let i = 0; i < password.length - 2; i++) {
        const char1 = password.charCodeAt(i);
        const char2 = password.charCodeAt(i + 1);
        const char3 = password.charCodeAt(i + 2);

        // 检查数字连续 (如123)
        if (char2 === char1 + 1 && char3 === char2 + 1) {
            return { valid: false, message: "密码包含连续数字" };
        }

        // 检查字母连续 (如abc)
        if (Math.abs(char2 - char1) === 1 && Math.abs(char3 - char2) === 1) {
            const isLower = char1 >= 97 && char1 <= 122;
            const isUpper = char1 >= 65 && char1 <= 90;
            if ((isLower && char2 === char1 + 1 && char3 === char2 + 1) || 
                (isUpper && char2 === char1 + 1 && char3 === char2 + 1)) {
                return { valid: false, message: "密码包含连续字母" };
            }
        }
    }

    // 检查重复字符
    for (let i = 0; i < password.length - 2; i++) {
        if (password[i] === password[i+1] && password[i] === password[i+2]) {
            return { valid: false, message: "密码包含重复字符" };
        }
    }

    return { valid: true, message: "密码有效" };
}

方法三:使用密码强度库

对于更全面的密码策略,可以考虑使用现成的库如: - zxcvbn (Dropbox开发的密码强度评估库) - password-validator

// 使用password-validator示例
const passwordValidator = require('password-validator');

const schema = new passwordValidator();
schema
    .is().min(8)
    .is().max(100)
    .has().not().spaces()
    .has().not().sequentialLetters(3)  // 不允许3个连续字母
    .has().not().sequentialDigits(3)   // 不允许3个连续数字
    .has().not().repeating(3);        // 不允许3个重复字符

function validateWithLibrary(password) {
    const result = schema.validate(password, { details: true });
    if (result.length > 0) {
        return { valid: false, message: result[0].message };
    }
    return { valid: true, message: "密码有效" };
}

最佳实践建议

  1. 组合多种校验:结合正则表达式和算法校验
  2. 提供明确反馈:告诉用户具体哪里不符合要求
  3. 平衡安全与可用性:不要设置过于严格的规则
  4. 考虑使用密码强度计:实时显示密码强度
  5. 服务器端验证:客户端验证不能替代服务器端验证

这些方法可以根据你的具体需求进行调整和组合使用。