提问人: 提问时间:6/21/2020 最后编辑:oguz ismail 更新时间:6/21/2020 访问量:170
验证混淆令牌
Validating an obfuscation token
问:
我正在构建一种安全的算法来摆脱混淆攻击。使用令牌验证用户,该令牌应满足以下条件:
- 用户名仅为小写字母,用户名长度至少为 5 位。
- username 后跟 #。
- # 之后的前两个字符很重要。始终是一个数字和一个字符。此部分至少包含一个数字、一个小写字母和一个大写字母。
- 在两者之间,只能有任意数量的数字或字母。
- 最后,数字和字符应与 point-3 的数字和字符完全匹配。
- 它应以 # 结尾。
- 两个 # 中间的字符长度应至少为 5 个字符。
- 完整的标记仅由两个 #、小写和大写字母和数字组成。和
我不了解正则表达式,但我的指南告诉我,在验证时,正则表达式很容易完成这项任务。我在互联网上找了很久,发现了一些相似的链接,并尝试将它们组合起来,得到了这个:
^[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]*\1#$
上述正则表达式的解释:
^, $
- 分别表示行的开始和结束。[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]*
- 匹配上述字符集中的零个或多个字符。\1
- 表示与捕获的组完全匹配的反向引用。
您可以在此处找到上述正则表达式的演示。
注意:如果您想一次匹配一个字符串,即出于实际目的;从字符集中删除。\n
您可以使用此正则表达式作为替代方法。
^[a-z]{5,}#(?=.*?[a-z])(?=.*?[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*\1#$
推荐阅读:对比原理
评论
^[a-z]{5,}#(([0-9][A-Z])[0-9A-Z]*[a-z][0-9A-Za-z]*|([0-9][a-z])[0-9a-z]*[A-Z][0-9A-Za-z]*)(\2|\3)#$
评论