Php авторизация с шифрованием

Форма авторизации с отправкой зашифрованного пароля

В этой статье я решил выложить свое представление о авторизации на сайте при помощи PHP.
Конечно если авторизация происходит на SSL риски того, что пароль будет перехвачен при помощи снифера становятся ничтожными. Но все же, такой вид авторизации не везде используется. Один из видов защиты — это содержание пароля в виде хеша. Но ведь при авторизации пароль оправляется в POST запросе на сервер и существует шанс его выловить. Поразмыслив, я решил попробовать реализовать схему авторизации при которой пароль не будет отправляться на сервер в том виде в котором он есть. И даже не его MD5 хеш. В планах было что то подобное алгоритму ms-chap.

А именно:

1) При посещении сайта неавторизированному пользователю в куке выдается уникальный id.
2) Если пользователь решил авторизоваться, при заполнении пароля генерируется хеш на базе md5 хеша его пароля и выданного ему со стороны сервера id.
3) После попытки авторизации, вне зависимости от ее итогов, id перезаписывается.

Что мы получаем в итоге? При каждой попытке авторизации генерируется новый хеш отличный от предыдущего и вылавливать его смысла нету.

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

Итак в корне сайта пользователю присваивается «соль» которая генерируется в самом начале, а так же после каждой попытки авторизации.

session_start(); //Присваиваем значение уникальный id если отсутствует if(!isset($_SESSION['uniq'])||$_SESSION['uniq']=='') < $_SESSION['uniq']=uniqid(); >?> 
  
//поле ввода логина //поле для ввода пароля //скрытое поле в котором генерируется хеш пароля //кнопка ввода
//Функция генерации хеша

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

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

function CheckLogin($login,$md5pass) < //Получаем пароль из базы данных $pass="MD5 пароль из базы данных" ; //Прибавляем к ней уникальный id полученный в индексе при посещении $pass.=$_SESSION['uniq']; //Получаем хеш этой гремучей смеси $pass=md5($pass); //Удаляем уникальный id чтоб в следующий раз пароли опять получились новые unset($_SESSION['uniq']); //Ну и сравниваем хеш if(strcmp($md5pass,$pass)==0) < echo "Авторизация прошла успешно. Если вы не переместились на страницу обновите ее"; $_SESSION['id']=session_id(); >//Обновляем страницу удобным нам способом . > 

UPD: Статья предполагала не сам код, а алгоритм реализацию которого каждый видит по своему. А не для развода холивара на тему «скопировал образовалась дырка и вообще нифига не пашет» и скобки криво стоят. Но так как все комментарии уперлись именно в это пришлось убрать кот который был примитивным и подразумевал действия на не инструкции.

Источник

Читайте также:  Hello Node.js

Безопасный метод авторизации на PHP

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

1. Модель (клиент)
Регистрация
— логин (a-z0-9)
— пароль
Вход
— логин
— пароль
Cookie
— уникальный идентификатор юзера
— хэш

Модель (сервер)
MySQL
Таблица users
user_id (int(11))
user_login (Varchar(30))
user_password (varchar(32))
user_hash (varchar(32))
user_ip (int(10)) по умолчанию 0

При регистрации в базу данных записываеться логин пользователя и пароль(в двойном md5 шифровании)

При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.

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

Читайте также:  Сортировка объекта по дате java

2. Если злоумышленик вытащит трояном у пользователя уникальный хеш, воспользовать им он также не сможет(разве если только, пользователь решил принебречь своей безопастностью и выключил привязку к IP при авторизации).

2. Практика

— Структура таблицы `users`

CREATE TABLE `users` (

`user_id` int(11) unsigned NOT NULL auto_increment,

`user_login` varchar(30) NOT NULL,

`user_password` varchar(32) NOT NULL,

`user_hash` varchar(32) NOT NULL,

`user_ip` int(10) unsigned NOT NULL default ‘0’,

PRIMARY KEY (`user_id`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

register.php

// Страница регситрации нового пользователя

mysql_connect ( «localhost» , «myhost» , «myhost» );

if(! preg_match ( «/^[a-zA-Z0-9]+$/» , $_POST [ ‘login’ ]))

Источник

Как хранить пароли в БД (PHP). Шифрование, хеширование паролей

Главная причина — минимизация ущерба в случае утечки базы данных.

Если злоумышленник получит только логины и email-адреса пользователей — это плохо, но не критично.

Но если в его руках окажутся логины и пароли, он может попытаться использовать эти данные для входа в почтовые сервисы (Gmail, Яндекс.Почта, Mail.ru и т.д.), социальные сети, мессенджеры, клиент-банки и т.д.

В тот же личный кабинет Пятёрочки, чтобы перевыпустить карту и потратить чужие бонусы.

Мем с бабкой - Где мои баллы?!

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

Некоторые разработчики считают, что их приложение надёжно защищено и никаких утечек быть не может. Есть несколько причин, почему это мнение ошибочно:

  • Разработчик — не робот, он не может не совершать ошибок.
  • Взлом может произойти со стороны хостинг-провайдера, работу которого не всегда возможно контролировать.
  • Некорректная настройка сервера может привести к возможному доступу других пользователей хостинга к вашему сайту (актуально для виртуальных хостингов).
  • Бывший коллега по работе может слить базу данных конкурентам. Может в качестве мести, а может просто ради денег.
Читайте также:  Паттерн стратегия java примеры

Короче, пароли в открытом виде хранить нельзя.

Шифрование и хеширование

Шифрование — это обратимое преобразование текста в случайный набор символов.

Хеширование — это необратимое преобразование текста в случайный набор символов.

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

Приведу пример шифрования. У нас есть сообщение:

Зашифруем сообщение по следующему алгоритму: сдвинем каждую букву на 1 в алфавитном порядке, т.е. а превращается в б , г превращается в д , я превращается в а . Так будет выглядеть зашифрованный текст:

Зашифровали. Теперь для расшифровки нужно выполнить обратную операцию, сдвинуть все буквы на 1 символ назад. К слову, этот алгоритм шифрования называется шифр Цезаря (Википедия).

В отличие от шифрования, хеширование не имеет (вернее, не должно иметь) способа «расхешировать» строку обратно:

Шифрование паролей

Не надо шифровать пароли.

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

Хеширование паролей и авторизация

Для хеширования паролей в PHP существует функция password_hash() :

$password = '123456'; $hash = password_hash($password, PASSWORD_BCRYPT); var_dump($hash); // string(60) "$2y$10$Vb.pry5vRGNrm6Y79UfBsun/RbXq2.XEGCOMpozrDwg.MNpfxvWHK"

Вторым параметром передаётся алгоритм хеширования. По-умолчанию это указанный нами bcrypt, но я рекомендую указывать его вручную, поскольку базовый алгоритм в будущем может поменяться. Будет грустно, если при очередном обновлении версии PHP на сайте отвалится авторизация.

Для проверки корректности введённого пользователем пароля используется функция password_verify() :

Ещё раз. При регистрации пользователя нужно передать пароль в функцию password_hash() , а полученный хеш сохранить в базу данных.

При попытке авторизации получаем пользователя по его логину и проверяем функцией password_verify() , соответствует ли хеш пароля тому паролю, который ввёл пользователь.

Таким образом, хранить исходный пароль больше нет смысла.

Да, разные алгоритмы хеширования генерируют хеш разной длины, поэтому рекомендуется хранить хеш в поле с типом VARCHAR(255).

Алгоритмы MD5 и SHA1

В интернете ещё встречаются статьи, где рекомендуется хешировать пароли функциями md5() и sha1() .

Для хеширования паролей их использовать нельзя!

Эти алгоритмы давно устарели и не являются безопасными (Документация). Вместо этого используйте функцию password_hash() , которую мы разобрали выше.

Источник

Оцените статью