Интернет - справочник для веб-мастеров
    441-847-152
     
 
 
php, javascript,ajax,mysql,TIGER CMS
  Для начинающих
php, javascript,ajax,mysql,TIGER CMS
  Общие
php, javascript,ajax,mysql,TIGER CMS
  Безопасность
php, javascript,ajax,mysql,TIGER CMS
  Интересное
php, javascript,ajax,mysql,TIGER CMS
  Новости PHP
php, javascript,ajax,mysql,TIGER CMS
  PHP + AJAX
php, javascript,ajax,mysql,TIGER CMS
  JavaScript
php, javascript,ajax,mysql,TIGER CMS
  Дизайн
php, javascript,ajax,mysql,TIGER CMS
  Раскрутка
php, javascript,ajax,mysql,TIGER CMS
  Заработок
php, javascript,ajax,mysql,TIGER CMS
  Советы

   
 

   
 
  SEO статьи HTML, как раскрутить сайт
1. Рейтинг сайтов



 
 
  Всего статей: 405
  Опубликовано: 405
  Проверяються: 0
  Добавлено сегодня: 0
-------------------------------------
  Прочитано статей: 405
  Всего прочтений: 181097
-------------------------------------
  Сейчас читают: 7 чел.


 

Хэширование паролей в PHP [Версия для печати]
Разместил: admin . Раздел: Безопасность. Опубликовано: 07-28-2007 10:30:10
В этой статье мы рассмотрим процесс хэширования паролей, не слишком сложный, но относительно мало распространенный процесс в web-программировании. Хранение паролей пользователей в открытом виде в базе данных - не слишком хороший подход, особенно если к этой базе может получить доступ любой пользователь интернета. Хэширование не панацея, но может значительно уменьшить ущерб в случае кражи данных. Что такое хэш-функция? Это функция, обладающая бесконечной областью определения, но конечной областью значения и одной интересной особенностью: даже при небольшом изменении входного значения значение функции меняется радикально. Основное назначение хэш-функций в криптографии - это генерация ключей на основе коротких и запоминаемых паролей (слабо запомнить 16 шестнадцатеричных разрядов?).

В нашем примере мы будем рассматривать самый распространенный язык - php, в качестве примера - алгоритм secure hashing algorithm 1 (sha-1). Алгоритм недостаточно сильный и вместо него уже рекомендуют использовать более стойкие, sha-256 и sha-512, однако для нашей примерной работы подойдет и он.

Перейдем непосредственно к делу. Работа пользователя начинается с сохранения пароля. поэтому посмотрим как мы можем сохранять хэш пароля пользователя:

<?php
$passwordhash
= sha1($_post['password']);
$sql = 'insert into user (username,passwordhash) values (?,?)';
$result = $db->query($sql, array($_post['username'], $passwordhash));
?>

В следующий раз нам надо проверить, правильно ли пользователь ввел пароль? Сделаем это так:

<?php
$passwordhash
= sha1($_post['password']);
$sql = 'select username from user where username = ? and passwordhash = ?';
$result = $db->query($sql, array($_post['username'], $passwordhash));
if (
$result->numrows() < 1)
{ echo
'sorry, your username or password was incorrect!'; }
else
{
printf('welcome back %s!', $_post['username']); }
?>

В php мы можем генерировать хэши при помощи md5 или sha1, в первом случае получаем 128-битное значение (32 символа), во втором 160-битный (40 символов).

Например в случае работы такого скрипта:

<?php
$string
= 'php & information security';
printf("original string: %sn", $string);
printf("md5 hash: %sn", md5($string));
printf("sha-1 hash: %sn", sha1($string));
?>

Мы можем получить примерно следующее:

original string: php & information security
md5 hash
: 88dd8f282721af2c704e238e7f338c41
sha
-1 hash: b47210605096b9aa0129f88695e229ce309dd362

В mysql мы можем генерировать хэши внутренними функциями password(), md5() или sha1, первая используется во встроенном механизме аутентификации сервера баз данных. Однако использовать его не рекомендуется, так как до версии 4.1 он был очень уязвим.

Естественно, что функции работают одинаково, поэтому можно проверять/сохранять хэши не средствами php, а средствами самого mysql:

<?php
$sql
= 'insert into user (username, passwordhash) values (?, sha1(?))';
$result = $db->query($sql, array($_post['username'], $_post['password']));
?>

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

<?php
define
('salt_length', 9);
function
generatehash($plaintext, $salt = null)
{
if (
$salt === null)
{
$salt = substr(md5(uniqid(rand(), true)), 0, salt_length);
}
else
{
$salt = substr($salt, 0, salt_length);
}
return
$salt . sha1($salt . $plaintext);
}
?>

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

Итого


Мы посмотрели как просто реализовать защиту. Однако приведенные выше примеры можно рассматривать только как начальную точку для ваших собственных php разработок. Программируйте в удовольствие!
Источник: http://www.internet-technologies.ru/   Прочитана 470 раз.
  Закладки:  
     
     
     
Google
 




     
Copyright 2007 by bvisoft.com