验证混淆令牌
Validating an obfuscation token
我正在构建一个安全算法来摆脱混淆攻击。使用应满足以下条件的令牌验证用户:
- 用户名只能使用小写字母且用户名至少为 5 位数字。
- 用户名后跟#.
- #前两个字符很重要。总是一个数字和一个字符。这部分至少包含一个数字,一个小写字母和一个大写字母。
- 中间可以有任意数量的数字或字母。
- 最后的数字和字符必须与点3的数字和字符完全匹配。
- 应该以#结尾。
- 两个#中间的字符至少要有5个字符。
- 完整的token只有两个#,大小写字母和数字。并且
我不知道正则表达式,但我的向导告诉我这个任务很容易通过正则表达式在验证时完成。我在网上找了很久,发现了一些相似的链接,并尝试将它们组合起来,得到了这个:
^[a-z]{5,}#[a-zA-Z0-9]{2}[A-Z][0-9A-Za-z]*[a-zA-Z0-9]{2}#$
但这只匹配了 1 个测试用例。我不知道如何实现两个哈希的中间部分。我试着用我的英语解释我的问题。请帮助。
以下测试用例应该通过
userabcd#4a39A234a#
randomuser#4A39a234A#
abcduser#2Aa39232A#
abcdxyz#1q39A231q#
randzzs#1aB1a#
以下测试用例应该会失败:
randuser#1aaa1a#
randuser#1112#
randuser#a1a1##
randuser#1aa#
u#4a39a234a#
userstre#1qqeqe123231q$
user#1239a23$a#
useabcd#4a39a234a#12
你可以试试:
^[a-z]{5,}#(?=[^a-z\n]*[a-z])(?=[^A-Z\n]*[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*#$
上面正则表达式的解释:
^, $
- 分别表示行的开始和结束。
[a-z]{5,}
- 匹配小写用户名 5 次或更多次。
#
- 按字面意思匹配 #
。
(?=[^a-z]*[a-z])
- 表示肯定的前瞻断言至少有一个小写字母。
(?=[^A-Z]*[A-Z])
- 表示肯定的前瞻断言至少有一个大写字母。
(\d[a-zA-Z])
- 表示匹配前 2 个字符的捕获组,即一个数字和一个字母。如果您想要其他方式,请使用 [a-zA-Z]\d
.
[a-zA-Z\d]*
- 匹配上述字符集中的零个或多个字符。
</code></strong> - 表示完全匹配捕获组的反向引用。</p>
</li>
</ul>
<p>你可以在<a href="https://regex101.com/r/inHIRq/4" rel="nofollow noreferrer"><strong>here.</strong></a></p>中找到上述正则表达式的演示
<p><strong>注意:</strong>如果你想一次匹配一个字符串,即出于实际目的;从字符集中删除 <code>\n
。
您可以使用此正则表达式作为替代。
^[a-z]{5,}#(?=.*?[a-z])(?=.*?[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*#$
推荐阅读: Principle of contrast
我正在构建一个安全算法来摆脱混淆攻击。使用应满足以下条件的令牌验证用户:
- 用户名只能使用小写字母且用户名至少为 5 位数字。
- 用户名后跟#.
- #前两个字符很重要。总是一个数字和一个字符。这部分至少包含一个数字,一个小写字母和一个大写字母。
- 中间可以有任意数量的数字或字母。
- 最后的数字和字符必须与点3的数字和字符完全匹配。
- 应该以#结尾。
- 两个#中间的字符至少要有5个字符。
- 完整的token只有两个#,大小写字母和数字。并且
我不知道正则表达式,但我的向导告诉我这个任务很容易通过正则表达式在验证时完成。我在网上找了很久,发现了一些相似的链接,并尝试将它们组合起来,得到了这个:
^[a-z]{5,}#[a-zA-Z0-9]{2}[A-Z][0-9A-Za-z]*[a-zA-Z0-9]{2}#$
但这只匹配了 1 个测试用例。我不知道如何实现两个哈希的中间部分。我试着用我的英语解释我的问题。请帮助。
以下测试用例应该通过
userabcd#4a39A234a#
randomuser#4A39a234A#
abcduser#2Aa39232A#
abcdxyz#1q39A231q#
randzzs#1aB1a#
以下测试用例应该会失败:
randuser#1aaa1a#
randuser#1112#
randuser#a1a1##
randuser#1aa#
u#4a39a234a#
userstre#1qqeqe123231q$
user#1239a23$a#
useabcd#4a39a234a#12
你可以试试:
^[a-z]{5,}#(?=[^a-z\n]*[a-z])(?=[^A-Z\n]*[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*#$
上面正则表达式的解释:
^, $
- 分别表示行的开始和结束。[a-z]{5,}
- 匹配小写用户名 5 次或更多次。#
- 按字面意思匹配#
。(?=[^a-z]*[a-z])
- 表示肯定的前瞻断言至少有一个小写字母。(?=[^A-Z]*[A-Z])
- 表示肯定的前瞻断言至少有一个大写字母。(\d[a-zA-Z])
- 表示匹配前 2 个字符的捕获组,即一个数字和一个字母。如果您想要其他方式,请使用[a-zA-Z]\d
.[a-zA-Z\d]*
- 匹配上述字符集中的零个或多个字符。</code></strong> - 表示完全匹配捕获组的反向引用。</p> </li> </ul> <p>你可以在<a href="https://regex101.com/r/inHIRq/4" rel="nofollow noreferrer"><strong>here.</strong></a></p>中找到上述正则表达式的演示 <p><strong>注意:</strong>如果你想一次匹配一个字符串,即出于实际目的;从字符集中删除 <code>\n
。
您可以使用此正则表达式作为替代。
^[a-z]{5,}#(?=.*?[a-z])(?=.*?[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*#$
推荐阅读: Principle of contrast