Конечно если авторизация происходит на SSL риски того, что пароль будет перехвачен при помощи снифера становятся ничтожными. Но все же, такой вид авторизации не везде используется. Один из видов защиты — это содержание пароля в виде хеша. Но ведь при авторизации пароль оправляется в POST запросе на сервер и существует шанс его выловить. Поразмыслив, я решил попробовать реализовать схему авторизации при которой пароль не будет отправляться на сервер в том виде в котором он есть. И даже не его MD5 хеш. В планах было что то подобное алгоритму ms-chap.
А именно:
1) При посещении сайта неавторизированному пользователю в куке выдается уникальный id.
2) Если пользователь решил авторизоваться, при заполнении пароля генерируется хеш на базе md5 хеша его пароля и выданного ему со стороны сервера id.
3) После попытки авторизации, вне зависимости от ее итогов, id перезаписывается.
Что мы получаем в итоге? При каждой попытке авторизации генерируется новый хеш отличный от предыдущего и вылавливать его смысла нету.
Итак приступим:
Так как статья не подразумевала готового кода а больше ориентировалась на алгоритм и логику, указаны только те басовые моменты на которых основывается реализация данной логики. Суть тут больше в алгоритме а окружение каждый строит по своему.
Итак в корне сайта пользователю присваивается «соль» которая генерируется в самом начале, а так же после каждой попытки авторизации.
session_start(); //Присваиваем значение уникальный id если отсутствует if(!isset($_SESSION['uniq'])||$_SESSION['uniq']=='') { $_SESSION['uniq']=uniqid(); } ?>
Далее в форме логина:
<form action="" method="post"> //поле ввода логина <input type="email" placeholder="E-mail" name="login"> //поле для ввода пароля <input id="pass" type="password" placeholder="Пароль" > //скрытое поле в котором генерируется хеш пароля <input id="hidpass" type="hidden" name="password" value="" > //кнопка ввода <button type="submit" >Войти</button> </form> //Функция генерации хеша <script> $(function () { $("#pass").on("input",function(e){ //При вводе данных в поле пароля автоматически происходит кодирование их в MD5 добавляется уникальный id и еще раз кодируется после чего присваивается к скрытому полю для дальнейшей отправки var pass=CryptoJS.MD5($('#pass').val())+'<?php echo $_SESSION['uniq']?>'; var md5pass=CryptoJS.MD5(pass); $('#hidpass').val(md5pass.toString()); }); }); </script>
Как получаем постоянно меняющийся пароль, разобрались, осталось разобраться что с ним делать.
После отправки формы мы попадаем в функцию проверки логина и пароля. Тут тоже на вкус и цвет фломастеры разные. В моем случае вместо формы вызывается функция авторизации после итогов которой страница просто обновляется и если авторизация была успешной то мы попадаем в наше рабочее пространство. Если же итог неудачный, то мы снова глядим на форму входа.
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: Статья предполагала не сам код, а алгоритм реализацию которого каждый видит по своему. А не для развода холивара на тему «скопировал образовалась дырка и вообще нифига не пашет» и скобки криво стоят. Но так как все комментарии уперлись именно в это пришлось убрать кот который был примитивным и подразумевал действия на не инструкции.

