Проверка токена обфускации - PullRequest
1 голос
/ 20 июня 2020

Я создаю защищенный алгоритм, чтобы избавиться от атак обфускации. Пользователь подтверждается токеном, который должен удовлетворять следующему условию:

  1. имя пользователя только строчными буквами и имя пользователя не менее 5 di git в длину.
  2. имя пользователя сопровождается # .
  3. После # важны первые два символа. Ди git и символ всегда. Эта часть содержит как минимум di git, строчную и прописную буквы.
  4. Между ними может быть любое количество цифр или букв.
  5. В последнем случае di git и символ должен точно соответствовать di git и символу точки-3.
  6. Он должен заканчиваться на #.
  7. Символы в середине двух # должны быть не менее 5 символов.
  8. Полный токен состоит только из двух #, строчных и прописных букв и цифр. И

Я не знаю о регулярных выражениях, но мой гид сказал мне, что эта задача легко достигается во время проверки с помощью регулярных выражений. После того, как я долго искал inte rnet и нашел несколько похожих ссылок, попытался их объединить и получил следующее:

^[a-z]{5,}#[a-zA-Z0-9]{2}[A-Z][0-9A-Za-z]*[a-zA-Z0-9]{2}#$

Но это соответствует только 1 тесту. Я не знаю, как мне получить среднюю часть двух хешей. Я попытался объяснить свою проблему на моем английском sh. Пожалуйста, помогите.

Ниже тестовые примеры должны пройти

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

1 Ответ

1 голос
/ 20 июня 2020

Вы можете попробовать:

 ^[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]) - представляет группу захвата, соответствующую первым двум символам, т.е. ди git и букве. Если вы хотите другой способ, используйте [a-zA-Z]\d.

  • [a-zA-Z\d]* - соответствие нулю или более символов в указанном наборе символов.

  • \1 - представляет обратную ссылку, точно соответствующую захваченной группе.

Вы можете найти демонстрацию вышеуказанного регулярного выражения в * Здесь 1068 *.

Примечание: Если вы хотите сопоставить одну строку за раз, например, для практических целей; удалить \n из наборов символов.

Вы можете использовать это регулярное выражение в качестве альтернативы.

^[a-z]{5,}#(?=.*?[a-z])(?=.*?[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*\1#$

Рекомендуемое чтение: Принцип контраста

...