如何编写可在文本及二进制数据中检测密码的PCRE正则表达式?
解决二进制数据中密码检测的正则方案
你的核心问题是原正则依赖空白字符作为边界,但二进制数据里的密码往往没有空白包围,甚至嵌在乱码字节中,所以需要移除空白相关的断言,调整为基于密码字符集的匹配逻辑。
修改后的PCRE正则
(?=(?:.*[a-z]))(?=(?:.*[A-Z]))(?=(?:.*\d))(?=(?:.*[[:punct:]]))[a-zA-Z\d[:punct:]]{10,}
关键调整说明
- 移除了原正则中的
(?<!\S)和(?!\S)空白边界断言,不再依赖周围的空白字符,直接匹配连续的符合规则的字符序列。 - 四个正向预查
(?=(?:.*[x]))分别确保序列包含小写字母、大写字母、数字、标点符号,满足你的密码规则。 - 最后用
[a-zA-Z\d[:punct:]]{10,}匹配连续的、属于密码字符集的序列,长度至少10位。
优化建议(减少误报)
二进制数据中容易出现大量类似密码的乱码序列,可通过以下方式优化:
- 限制最大长度:把
{10,}改成{10,30},因为真实密码一般不会超过30位,过滤过长的乱码。 - 增加非密码字符边界:如果要避免匹配长序列中的子串,可添加负向断言确保前后不是密码字符:
(?:(?<![a-zA-Z\d[:punct:]])|^)(?=(?:.*[a-z]))(?=(?:.*[A-Z]))(?=(?:.*\d))(?=(?:.*[[:punct:]]))[a-zA-Z\d[:punct:]]{10,30}(?:(?![a-zA-Z\d[:punct:]])|$)
内容的提问来源于stack exchange,提问作者jpe
相关产品推荐
相关产品推荐

