Авторизация, регистрация, аутентификация и прочие штуки про шифрование

Когда-то давным-давно, мне удалось потрудиться на благо родины в качестве десантника-связиста. Тогда я работал с аппаратурой шифрования каналов связи высокой стойкости. Но парадокс — мне это было не интересно. Было понимание механики процесса, и этим, в принципе, всё ограничивалось.

Я знал, что вот у меня в руках ключ, а вот шайтан-коробка, которая без ключа, не даст связать двух слов.

А вот сейчас стало интересно, как-же эта шайтан-коробка устроена.

Ради науки и забавы, я предпринял попытку создать свою Энигму. Вот, посмотрите на результат, пожалуйста.

Я назвал это — Цветошифр. Устроено там всё практически как в настоящей Энигме. У нее было три ротора, а у меня три канала RGB. Собственно, подобрав нужный цвет, вы сможете прочесть секретную надпись.

подсказка: выбирайте черный цвет

Начитавшись умной литературы про обратимое и необратимое шифрование, ко мне пришло понимание, что свой велосипед изобретать в этом деле — плохая затея.

А еще пришло осознание, что я мог целых четыре прекрасных года изучать эти весьма занимательные штуки. А мне было не интересно =( Ох как я был не прав =(

Ну хватит лирики! Зачем это всё в конце концов нужно?

Я создаю не простой бложиг или лендинг, я создаю неужели я сейчачс это скажу вслух — бизнес-приложение.

Самое ценное — информация. Причем абсолютно вся. И моя задача — максимально усложнить жизнь тому парню, который решит этой информацией завладеть.

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

А, забыл вас уведомить — было принято одно очень важное решение. Тэ-Зэшница переехала на новый домен и новый хостинг. Старый не давал поддержки php7. А еще меня жутко бесит старая БД. Тот самый парень который придумал её до меня, хранил всё в windows-1251. А я хочу в utf-8. И я не хочу чтоб вобще существовали поля с названиями типа `ime_maketa` и т. п. Короче — всё с чистого листа.

Приступим

Создадим таблицу Юзеров со следующими колонками:

  • id
  • login
  • password
  • sid (сессия)
  • time (загадочное значение, потом объясню)

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

  • id
  • email
  • phonenuber
  • ipn (номер внутреннего рабочего телефона)
  • realname
  • patronymic
  • surname
  • gender
  • dob (дата рождения)
  • yob (год рождения)
  • avatarpath (путь до аватарки)
  • role (печатник/макетчик/менеджер и т. д.)

Для начала, создадим, собственно Дверь в Тэ-Тэшницу, и настроим авторизацию с регистрацией, и протестируем все это дело на незашифрованных данных. Тоесть пароль мы сразу зашифруем, есейственно. Небудем шифровать пока все остальное.

В целях некомпромитации Двери в Тэ-Зэшницу, я не стану приводить листинг её кода. Обмолвлюсь лишь одним важным для меня событием — я впервые использовал MySQL запрос сложнее обычного SELECT * FROM table WHERE id = ’id’. Впервые использовал JOIN для выборки данных из двух таблиц хD

Регистрация

Она будет не совсем открытой. Мне не хочется, чтоб любой залетный мог зарегится и что-то поглядеть. Регистрация будет по инвайтам.

Как бы это реализовать? Давайте рассуждать!

Раздавать инвайты смогут руководители подразделений. Для этого в их собственном профиле будет нужная кнопка. Нажал — выдало псевдослучайный ключ. Я сначала хотел залупить Хеш какой-нибудь, но потом подумал — а как человек вводить то его будет? Хочу чтоб это было слово, на кириллице, из 5 символов. Наличие инвайтов будем хранить в таблице invites, и после использования будем их оттудова удалять.

Где взять список слов из 5 букв? И желательно не матерных. Пойдем в гугл!

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

Листинг скрипта генерирования случайного ключа:

<?php

$invite_keys = array('Автол', 'Алиби', 'Ангел', 'Архар', 'Адепт', 'Алмаз', 'Апорт', 'Астма', 'Аборт', 'Актер', 'Босой', 'Брысь', 'Булат', 'Бухта', 'Багет', 'Барак', 'Батог', 'Белка', 'Бирюк', 'Бобик', 'Валок', 'Ввысь', 'Веник', 'Вечор', 'Вилка', 'Вкось', 'Вовсе', 'Волос', 'Врать', 'Вчера', 'Грязи', 'Гайка', 'Гетры', 'Гнать', 'Гольф', 'Графа', 'Греча', 'Гудок', 'Гамак', 'Гипюр', 'Давно', 'Декан', 'Динго', 'Домна', 'Драка', 'Дубль', 'Дылда', 'Дверь', 'Дерби', 'Днище', 'Езжай', 'Ехать', 'Егерь', 'Егоза', 'Ездок', 'Есаул', 'Евреи', 'Ездка', 'Ересь', 'Евнух', 'Желоб', 'Жилье', 'Жерло', 'Жокей', 'Жалко', 'Живот', 'Жучка', 'Ждать', 'Жилой', 'Жерех', 'Завет', 'Зайка', 'Запал', 'Затор', 'Зерно', 'Зурна', 'Загиб', 'Закон', 'Запор', 'ЗачетИзвоз', 'Инъяз', 'Игрец', 'Изъян', 'Ислам', 'Исход', 'Иерей', 'Икота', 'Извод', 'Интер', 'Кабан', 'Калан', 'Капля', 'Каток', 'Кивер', 'Класс', 'Кобра', 'Колит', 'Копер', 'Косой', 'Лакей', 'Левый', 'Лесть', 'Линза', 'Ложка', 'Лычки', 'Люпин', 'Ларек', 'Лезть', 'Леший', 'Мадам', 'Маляр', 'Маска', 'Мерка', 'Мидия', 'Мойва', 'Мотор', 'Муфта', 'Мазут', 'Мание', 'Набок', 'Нажиг', 'Намыв', 'Начет', 'Несть', 'Нищий', 'Нынче', 'Навет', 'Назло', 'Нарез', 'Оплот', 'Орлан', 'Отбой', 'Откуп', 'Отчий', 'Образ', 'Овощь', 'Океан', 'Олово', 'Оптик', 'Пакет', 'Пария', 'Пачка', 'Персы', 'Пикап', 'Пласт', 'Побег', 'Пойло', 'Полоз', 'Порка', 'Рампа', 'Рдеть', 'Рента', 'Родич', 'Рояль', 'Русло', 'Рябой', 'Расти', 'Редут', 'Реять', 'Ссора', 'Столб', 'Судак', 'Сухой', 'Сырье', 'Салон', 'Сауна', 'Свора', 'Секач', 'Сеять', 'Такой', 'Тафта', 'Тенек', 'Титан', 'Топор', 'Трель', 'Тузик', 'Тыква', 'Талон', 'Твист', 'Угорь', 'Улика', 'Успех', 'Учхоз', 'Уесть', 'Умный', 'Утеря', 'Ушной', 'Уазик', 'Узник', 'Фугас', 'Фасад', 'Филей', 'Флокс', 'Фурор', 'Фенил', 'Финал', 'Форма', 'Франт', 'Фазис', 'Ханжа', 'Хлябь', 'Хорей', 'Херес', 'Ходок', 'Хохот', 'Халат', 'Хинди', 'Холст', 'Хурма', 'Цевье', 'Цибик', 'Цифра', 'Цевка', 'Цыпки', 'Цепка', 'Цитра', 'Цвето', 'Цыпка', 'Центр', 'Чабан', 'Чадра', 'Через', 'Чохом', 'Чулок', 'Чарка', 'Четки', 'Чтить', 'Чутье', 'Чекан', 'Шалый', 'Шашни', 'Шитый', 'Шмель', 'Штамп', 'Шутка', 'Шарах', 'Шелом', 'Шишак', 'Шофер', 'Щекот', 'Щетка', 'Щучий', 'Щегол', 'Щепка', 'Щиток', 'Щенок', 'Щипцы', 'Щелок', 'Щипок', 'Эвены', 'Энный', 'Эстет', 'Эмаль', 'Эскиз', 'Элита', 'Эркер', 'Экран', 'Эрзац', 'Этнос', 'Юниор', 'Юркий', 'Юлить', 'Юрист', 'Юкола', 'Юноша', 'Юдоль', 'Юннат', 'Юнкер', 'Ямина', 'Ясень', 'Ягода', 'Якуты', 'Ярыга', 'Ягель', 'Яхонт', 'Якорь', 'Ярлык', 'Явный');

$random_key =  rand(0, count($invite_keys)-1);

$invite_key = $invite_keys[$random_key];

echo $invite_key;

?>

Из клиента мы будем обращаться сюда Аяксом, и в случае, если руководитель не передумал, записывать ключ и руководителя в таблицу инвайтов.

Я, пожалуй, пока-что запишу себе один инвайт в базу руками. Для проверки работоспособности происходящего.

Поделиться
Отправить
 9   1 год