.NET环境下检测密码中长度≥5的正序逆序字母数字连续序列方案
.NET 密码连续序列校验实现方案
不推荐使用正则实现该需求:正则本身不擅长处理字符ASCII差值判断的场景,硬写正则不仅可读性极差、容易遗漏边界,后续维护成本也很高,直接遍历字符校验是更合适的方案。
实现代码
public bool CheckForInvalidSequence(string input) { // 长度不足5直接返回无违规序列 if (string.IsNullOrWhiteSpace(input) || input.Length < 5) return false; // 统一转大写,忽略大小写差异 char[] chars = input.ToUpperInvariant().ToCharArray(); // 遍历所有连续5个字符的窗口 for (int i = 0; i <= chars.Length - 5; i++) { char c0 = chars[i]; char c1 = chars[i+1]; char c2 = chars[i+2]; char c3 = chars[i+3]; char c4 = chars[i+4]; // 判断是否为同类型字符:全数字 或 全字母 bool allDigits = char.IsDigit(c0) && char.IsDigit(c1) && char.IsDigit(c2) && char.IsDigit(c3) && char.IsDigit(c4); bool allLetters = char.IsLetter(c0) && char.IsLetter(c1) && char.IsLetter(c2) && char.IsLetter(c3) && char.IsLetter(c4); if (!allDigits && !allLetters) continue; // 判断正序连续(后一个字符比前一个大1) bool isAsc = c1 - c0 == 1 && c2 - c1 == 1 && c3 - c2 == 1 && c4 - c3 == 1; // 判断逆序连续(后一个字符比前一个小1) bool isDesc = c0 - c1 == 1 && c1 - c2 == 1 && c2 - c3 == 1 && c3 - c4 == 1; if (isAsc || isDesc) return true; } // 未检测到违规序列 return false; }
说明:返回
true代表检测到违规连续序列,密码校验不通过;返回false代表无违规序列。
方案优势
- 逻辑清晰无歧义:所有判断规则一目了然,后续需要调整拦截的连续长度(比如改为≥6位才拦截),只需要修改窗口长度和对应判断逻辑即可
- 无漏判误判:只会拦截真正连续递增/递减的序列,不会像你之前的正则一样把
AEIOU这类不连续的不重复字符误判为违规 - 性能优异:密码长度一般都在20位以内,遍历开销可以忽略不计,远高于正则匹配的性能
内容的提问来源于stack exchange,提问作者Scooter
相关产品推荐
相关产品推荐

