Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Безопасное хранение авторизационных данных
 
 автор: Loki   (23.12.2008 в 12:58)   письмо автору
 
 

В форуме периодически всплывает вопрос где и как хранить пароли. Сразу рекомендуют хэш. А для пущей секретности - двойной (тройной, ... десятерной хэш). Данный способ прокатывает только до тех пор, пока код закрыт. Если же исходники открыты, то подобные манипуляции бессмысленны - алгоритм известен, а значит пароль можно взять перебором.
Для себя я придумал следующую схему:
<?
//$securecode генерируется один раз при установке системы и хранится в файле настроек сайта
$securecode=md5(rand());

//очевидно что это пароль пользователя
$pass='string';

//этот код мы храним в куках и используем для автоматической авторизации
$cookiehash=md5($pass.$securecode);

//этот код хранится в БД
$dbpass=md5($cookiehash.$securecode);


Таким образом, при том что алгоритм шифрования известен, для взлома пароля необходимо завладеть данными как минимум из двух источников: $securecode && ($cookiehash || $dbpass).

Единственное узкое место - подделка куки. Но в этом случае злоумышленник сможет только авторизоваться. Для изменения настроек ему все равно необходим пароль.

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

Какие будут мысли/замечания/идеи?

  Ответить  
 
 автор: Trianon   (23.12.2008 в 13:50)   письмо автору
 
   для: Loki   (23.12.2008 в 12:58)
 

Собственно, замечание одно.
Мощность множества возможных значений $securecode будет равна RAND_MAX .

  Ответить  
 
 автор: Loki   (23.12.2008 в 14:36)   письмо автору
 
   для: Trianon   (23.12.2008 в 13:50)
 

имеет смысл исправить на mt_rand()? или лучше что-то еще более серьезное?

  Ответить  
 
 автор: Trianon   (23.12.2008 в 15:27)   письмо автору
 
   для: Loki   (23.12.2008 в 14:36)
 

Про rand() и mt_rand(0 я как-то тут уже говорил.
Эти функции призваны генерировать статистически равномерную последовательность, а не одиночные данные. кроме того, никакой криптозащиты в них нет - они для этого попросту не предназначались.
rand дает RAND_MAX значений, но вовсе не все будут равновероятны при единственном вызове.
Я бы оперся на дрообную часть microtime (и может быть даже на результаты нескольких таких вызовов в разных http-запросах - на разных пользовательских шагах процесса установки движка)
вообще, чем больше непредсказуемых данных будет взято в затравку для такого ключа - тем лучше.
Если только они и вправду непредсказуемые.

  Ответить  
 
 автор: Loki   (23.12.2008 в 15:38)   письмо автору
 
   для: Trianon   (23.12.2008 в 15:27)
 

Собственно, наверное microtime и есть самое непредсказуемое.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования