Как проверить, соответствует ли ваш пароль стандартам безопасности

Вы когда-нибудь создавали регистрационную форму в своем приложении? Если да, то вы, вероятно, просили у пользователя пароль. В этом нет ничего нового, ничего страшного. Вы хотите сделать свое приложение безопасным и не позволять другим пользователям взламывать аккаунты других пользователей. Для этого пароль должен быть надежным. Пароль должен соответствовать следующим требованиям:

  • символы
  • специальные символы
  • числа
  • длина
  • и т.п.

Если пароль не соответствует шаблону, он считается ненадежным, и его легко взломать.

Но как проверить, соответствует ли пароль указанным выше требованиям? Вы можете использовать оператор if-else, некоторые логические операции и проверить, соответствует ли пароль указанным выше требованиям. Вроде бы нормально, но в этом случае может получиться длинный и нечитаемый код. К счастью, есть способ получше. Используя всего две строчки кода, мы можем проверить, удовлетворены ли указанные выше требования. Сначала познакомимся с регулярными выражениями.

1. Регулярные выражения

Согласно определению, приведенному на сайте ICU project (ICU расшифровывается как International Components for Unicode):

Пакет регулярных выражений ICU предоставляет приложениям возможность применять сопоставление регулярных выражений к строковым данным Unicode. Шаблоны и поведение регулярных выражений основаны на регулярных выражениях Perl.

API регулярных выражений ICU поддерживает операции, включая тестирование на соответствие шаблону, поиск совпадения с шаблоном и замену совпадающего текста. Группы захвата позволяют идентифицировать поддиапазоны в рамках общего совпадения и отображать их в тексте замены.

Это означает, что мы можем использовать некоторые специальные символы Unicode, чтобы проверить, безопасен ли наш пароль. Посмотрим, как это работает. Мы будем использовать NSPredicate, который можно использовать для фильтрации коллекций объектов.

Особый персонаж

Сначала мы проверяем, содержит ли пароль символы и один специальный символ и состоит ли его минимум из шести символов.

let password = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[a-z])(?=.*[$@$#!%*?&]).{6,}$")

password.evaluate(with: "pas$word") // True
password.evaluate(with: "password") // False

Давайте разберемся с этим.

"SELF MATCHES %@ "

Это означает, что левое выражение равно правому выражению с использованием сравнения в стиле регулярных выражений. Другими словами, наш пароль слева должен соответствовать требованиям справа. Некоторые основные регулярные выражения. Список всех регулярных выражений можно найти здесь.

^ - совпадение в начале строки.

(? = ...) - Истина, если шаблон в скобках совпадает с текущей входной позицией.

. * - совпадение любого символа как можно больше раз.

{n,} - совпадение не менее n раз. Сопоставьте как можно больше раз.

$ - совпадение в конце строки.

(?=.*[a-z]) - Check if password contains any character from a to z
(?=.*[$@$#!%*?&]) - Check if password contains any sepecial character listed in the square bracket. 
.{6,} - Check if password is six character long

Одна большая буква и один специальный символ

Теперь мы проверяем, содержит ли пароль одну большую букву, один специальный символ и минимум шесть знаков.

let password = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[a-z])(?=.*[$@$#!%*?&])(?=.*[A-Z]).{6,}$")
password.evaluate(with: "Pas$word") // True 
password.evaluate(with: "pas$word") // False 
password.evaluate(with: "password") // False
(?=.*[A-Z]) - Check if password contains at least one big letter.

Одна большая буква и одна цифра

Теперь мы проверяем, содержит ли пароль одну большую букву, одну цифру и минимум восемь символов.

let password = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z]).{8,}$")
password.evaluate(with: "Password1") // True 
password.evaluate(with: "Password") // False 
password.evaluate(with: "password") // False 
(?=.*[0-9]) - Check if password contains at least one number.

Завершить 🎉

Вы можете изменить приведенные выше выражения по своему усмотрению. Вы можете попросить пользователя ввести хотя бы две цифры или две большие буквы. Регулярные выражения очень полезны при сравнении строк. Регулярные выражения одинаковы для любого языка программирования. Их использование сэкономит вам время и работу. 👨🏼‍💻