验证混淆令牌

Validating an obfuscation token

我正在构建一个安全算法来摆脱混淆攻击。使用应满足以下条件的令牌验证用户:

  1. 用户名只能使用小写字母且用户名至少为 5 位数字。
  2. 用户名后跟#.
  3. #前两个字符很重要。总是一个数字和一个字符。这部分至少包含一个数字,一个小写字母和一个大写字母。
  4. 中间可以有任意数量的数字或字母。
  5. 最后的数字和字符必须与点3的数字和字符完全匹配。
  6. 应该以#结尾。
  7. 两个#中间的字符至少要有5个字符。
  8. 完整的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