Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, вопрос относительно безопасности 
:(
    Опции темы
manson
Дата 16.9.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



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

Подскажите, плз, в каком направлении двигаться...


PM MAIL   Вверх
Ипатьев
Дата 16.9.2009, 11:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



пароль, которых хранится в базе, можно хэшировать функцией sha1()

Добавлено через 1 минуту и 44 секунды
И давайте разделять понятия.
Если речь идет о безопасности, то давайте говорить о безопасности.
Если речь идет о некоем "задании", то давайте забудем о безопасности, и будем говорить об этом задании.

PM MAIL   Вверх
MoLeX
Дата 16.9.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



manson, вариантов два:
1. использовать стандартные ф-ции шифрования\хеширования
2. написать свою 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
manson
Дата 16.9.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



ммм... я так понял речь идет о пхп-функциях шифрования?  smile 
PM MAIL   Вверх
NewDima
Дата 16.9.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



храни в базе хэш пароля
Код

md5($password)

PM ICQ   Вверх
Ипатьев
Дата 16.9.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



не шифрования, а хэширования.
пример доступен в документации, по имени функции.
PM MAIL   Вверх
OutlawZ
Дата 16.9.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Манул рулит, в нем есть примеры использование функции шифрования:
Взято из мануала MD5
Цитата
 
<?php
$str = 'apple';

if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
    echo "Would you like a green or red apple?";
    exit;
}
?>


SHA1
Цитата

<?php
$str = 'яблоко';
                     
if (sha1($str) === '6099a566a619528259db5aa8d7a5aa2d4122259a') {
    echo "Желаете зеленое или красное яблоко?";
    exit;
}
?> 



Ну а если так то :

Код

$passwd = "lalalalal";
$cr = md5($password);
echo $cr;

или с sha1 

$passwd = "lalalalal";
$cr = sha1($password);
echo $cr;


То есть перед тем как пароль в БД запихнуть переменная с паролем скажем она методом пост передается $_POST['passwd'] должна пройти через функцию шифрования, можно записать так sha1($_POST['passwd']); и отпровляем ее в БД, только лучше отправить переменную $cr так как в ней функция шифрует полученный пароль от формы.


--------------------
user posted image
user posted image
PM MAIL   Вверх
NewDima
Дата 16.9.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



OutlawZ, не ьщифрование, а хэширование
PM ICQ   Вверх
gcc
Дата 16.9.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: -1
Всего: 17



хэш sha1,md5,etc еще можно "закриптографировать" md5crypt http://www.usenix.org/events/usenix99/prov...tml/node10.html

так как через "Радужные таблицы" можно перебрать хэш и взломать пароль http://ru.wikipedia.org/wiki/Радужная_таблица

я вот ковырял PostfixAdmin

Код



//
// generate_password
// Action: Generates a random password
// Call: generate_password ()
//
function generate_password ()
{
   $password = substr (md5 (mt_rand ()), 0, 8);
   return $password;
}



//
// pacrypt
// Action: Encrypts password based on config settings
// Call: pacrypt (string cleartextpassword)
//
function pacrypt ($pw, $pw_db="")
{
   global $CONF;
   $password = "";
   $salt = "";

   if ($CONF['encrypt'] == 'md5crypt')
   {
      $split_salt = preg_split ('/\$/', $pw_db);
      if (isset ($split_salt[2])) $salt = $split_salt[2];

      $password = md5crypt ($pw, $salt);
   }

   if ($CONF['encrypt'] == 'system')
   {
      if (ereg ("\$1\$", $pw_db))
      {
         $split_salt = preg_split ('/\$/', $pw_db);
         $salt = $split_salt[2];
      }
      else
      {
         $salt = substr ($pw_db, 0, 2);
      }
      $password = crypt ($pw, $salt);
   }

   if ($CONF['encrypt'] == 'cleartext')
   {
      $password = $pw;
   }

   return $password;
}



function md5crypt ($pw, $salt="", $magic="")
{
   global $MAGIC;

   if ($magic == "") $magic = $MAGIC;
   if ($salt == "") $salt = create_salt (); 
   $slist = explode ("$", $salt);
   if ($slist[0] == "1") $salt = $slist[1];

   $salt = substr ($salt, 0, 8);
   $ctx = $pw . $magic . $salt;
   $final = hex2bin (md5 ($pw . $salt . $pw));

   for ($i=strlen ($pw); $i>0; $i-=16)
   {
      if ($i > 16)
      {
         $ctx .= substr ($final,0,16);
      }
      else
      {
         $ctx .= substr ($final,0,$i);
      }
   }
   $i = strlen ($pw);
   
   while ($i > 0)
   {
      if ($i & 1) $ctx .= chr (0);
      else $ctx .= $pw[0];
      $i = $i >> 1;
   }
   $final = hex2bin (md5 ($ctx));

   for ($i=0;$i<1000;$i++)
   {
      $ctx1 = "";
      if ($i & 1)
      {
         $ctx1 .= $pw;
      }
      else
      {
         $ctx1 .= substr ($final,0,16);
      }
      if ($i % 3) $ctx1 .= $salt;
      if ($i % 7) $ctx1 .= $pw;
      if ($i & 1)
      {
         $ctx1 .= substr ($final,0,16);
      }
      else
      {
         $ctx1 .= $pw;
      }
      $final = hex2bin (md5 ($ctx1));
   }
   $passwd = "";
   $passwd .= to64 (((ord ($final[0]) << 16) | (ord ($final[6]) << 8) | (ord ($final[12]))), 4);
   $passwd .= to64 (((ord ($final[1]) << 16) | (ord ($final[7]) << 8) | (ord ($final[13]))), 4);
   $passwd .= to64 (((ord ($final[2]) << 16) | (ord ($final[8]) << 8) | (ord ($final[14]))), 4);
   $passwd .= to64 (((ord ($final[3]) << 16) | (ord ($final[9]) << 8) | (ord ($final[15]))), 4);
   $passwd .= to64 (((ord ($final[4]) << 16) | (ord ($final[10]) << 8) | (ord ($final[5]))), 4);
   $passwd .= to64 (ord ($final[11]), 2);
   return "$magic$salt\$$passwd";
}

function create_salt ()
{
   srand ((double) microtime ()*1000000);
   $salt = substr (md5 (rand (0,9999999)), 0, 8);
   return $salt;
}

function hex2bin ($str)
{
   $len = strlen ($str);
   $nstr = "";
   for ($i=0;$i<$len;$i+=2)
   {
      $num = sscanf (substr ($str,$i,2), "%x");
      $nstr.=chr ($num[0]);
   }
   return $nstr;
}

function to64 ($v, $n)
{
   global $ITOA64;
   $ret = "";
   while (($n - 1) >= 0)
   {
      $n--;
      $ret .= $ITOA64[$v & 0x3f];
      $v = $v >> 6;
   }
   return $ret;
}



Это сообщение отредактировал(а) gcc - 16.9.2009, 14:54
PM WWW ICQ Skype GTalk Jabber   Вверх
manson
Дата 16.9.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



Большое спасибо, OutlawZ! 
Только когда я обратно буду из базы доставать, как мне расшифровать?
PM MAIL   Вверх
NewDima
Дата 16.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Да тебе не нужно расшифровывать, хэшь не имеет дешифратора (кроме грубой силы, о_О и не только)!!!
Тебе всеголишь нужно будет сравнивать хэш пришедшего пароля с хэшем в базе

Это сообщение отредактировал(а) NewDima - 16.9.2009, 14:46
PM ICQ   Вверх
manson
Дата 16.9.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



to NewDima! 
Логично. Спс
PM MAIL   Вверх
OutlawZ
Дата 16.9.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Что бы сравнить хеши можно сделать что то вроде такого, из базы берем хеш по имени который было введено т.е придется составлять запрос такого вида:


Код

$query = select password from user where = '$_POST[name]';

То есть он выдаст поле хеша принадлежащие введенному имени, потом сравниваем вводимые данные с данными из БД

$query = select password from user where = '$_POST[name]';
$result = mysql_query($query) or die (mysql_error());
$row = mysql_fetch_array(result);

if ( $row[password] === $_POST['passwd'] ) 
{
   Пароль правильный
   делаем какие то операции
}else{
  Пароль неправильный либо такого нет
  запрос ввести заного или что нить такое :)
}


Ну думаю как то так smile)))

Забыл сказать что переменную $_POST['passwd'] надо перед тем как помещать в запрос проверить на опастные символы , с помощью рег выражения что бы не было ошибки запрос или какие нить хулиганы не получили доступ к бд.

Это сообщение отредактировал(а) MoLeX - 16.9.2009, 16:11


--------------------
user posted image
user posted image
PM MAIL   Вверх
Ипатьев
Дата 16.9.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



OutlawZ, вы забыли кое-что в своем замечательном коде.
Мне кажется, вы очень торопитесь все время.
PM MAIL   Вверх
MoLeX
Дата 16.9.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



OutlawZ, зачем все эти лишние телодвижения?
Код

$query = "SELECT * FROM `User` WHERE `name` = '".$_POST[name]." AND `pass` = '".md5($_POST['pass'])."' LIMIT 1';
...........



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1033 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.