Защищённая авторизация: Javascript+PHP+MD5

Если возникает проблема отправки данных на сервер защищённым способом (особенно это касается логина и пароля пользователя), а использовать SSL нет возможности, то можно воспользоваться вот таким решением.Качаем отсюда файл md5.js (реализация алгоритма шифрования md5 на JavaScript).Создаём страницу с формой авторизации

<?php $_SESSION['key'] = mt_rand();?><br><scripttype="text/javascript"src="js/md5.js"></script><br><scripttype="text/javascript"src="js/secure.js"></script><br><formaction="login.php"method="post"onsubmit="return crypt_form(this, 'key', 'hash')"><br> Login:<br><inputtype="text"name="login"/><br>    Password:<br><inputtype="password name="pass" /><br><input type="submit" value="Go" /><br><input type="hidden" name="key" value="<?=$_SESSION["key"]?>"><br><inputtype="hidden"name="hash"value=""/><br></form>

JavaScript (файл secure.js)

function crypt_form(frm)<br>{<br>   var elems = frm.elements;<br>   var key = elems[arguments[1] || 'key'];<br> var hash = elems[arguments[2] || 'hash'];<br>   for(i=0;i<elems.length.i++)<br>  {<br>       elem = elems[i];<br>        if(/password/.test(elem.type))<br>      {<br>           hash.value += '"' + elem.name + '" : "' + md5(key.value + md5(elem.value)) + '", ';<br>         elem.value = '';<br>        }<br>   }<br>   hash.value = '{' + hash.value + '}';<br>    key.value = '';<br> frm.submit();<br>   returnfalse;<br>}

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

list($key, $pass) = @each(db->getAssoc("SELECT pass FROM users WHERE login='?'", $_POST['login']));
if(!
$pass)    die("Invalid login");
if(
$_POST['hash'] != "")
{
   

$hash_array = json_decode($_POST['hash'], true);   

$result = ($hash_array['pass'] == md5($_SESSION['key'] + $pass));
}
else
    $result = (md5($_POST['pass']) == $pass);
if(!
$result)    die("invalid password");

Краткое описание. Сервер генерирует в рамках сессии некое случайное значение и передаёт его клиенту в виде скрытого поля в форме. Клиентский скрипт проходит по всем полям формы и для каждого поля с type == "password" генерирует значение

md5(key + md5(value))

, где key - наш случайный ключ, а value - собственно значение элемента. Такой подход позволяет не опасаться, что хеш пароля может быть перехвачен. Значения складываются в отдельный элемент типа hidden в формате JSON (JavaScript Object Notation). В реальной ситуации можно использовать и другой способ (например, сохранять полученный хеш прямо в поле password). Затем происходит отправка формы. return false в конце нужен для того, чтобы отменить стандартную отправку формы.

Серверный скрипт прежде всего проверяет значение поля hash и, если оно не пустое, достаёт оттуда данные функцией json_decode и сравнивает полученное значение со значением вычисленным следующим способом:

md5($key + $pass)

, где $key - наш случайный ключ, а $pass - сохранённый в БД хеш пароля. Если же параметр hash пуст, это означает, что у клиента отключен JavaScript и для порверки пароля нужно применять классический метод. Естественно, в данном случае нужно явно рекомендовать пользователю включиьт JS.
Для соединения с БД здесь использован PEAR::DB, большей частью для краткости примера)

Следующая запись

Предыдущая запись

Похожие записи

Комментарии

Еще нет комментариев.

Пингбэки

Оповещения открыты.

Трэкбэки

URL архива

Only authorized users can post comments