Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

[BETA] шифрование паролей - encrypt passwords

Здесь авторы могут постить бета-версии своих модификаций для phpBB 3.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

[BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

hook_encrypt_passwords - Encrypt Passwords Mod
v.1.0.5-20140320
copyright (c) 2014 c61 http://c61.no-ip.org <c61@yandex.ru>
license http://opensource.org/licenses/gpl-license.php GNU Public License


Не секрет, что данные форм (в том числе пароли) отправляются на сервер незашифрованными. Поскольку использование протокола https порой невозможно или весьма затруднительно, в этом случае имеется реальная (не потенциальная) уязвимость. Пакет с данными формы можно перехватить (при определённых условиях), например, в локальной сети, при использовании открытого wi-fi, на сервере и др. Обычно это вопрос доверия провайдеру/хостеру/сисадмину.

Перспективным представляется использование асимметричного алгоритма шифрования - RSA. Его особенность - использование пары ключей: public и private. Генерируется пара ключей, в нашем случае public используется для шифрования на стороне клиента (javascript), private - для расшифровки на стороне сервера (php). Public-ключ может передаваться по открытым каналам передачи, поскольку с его помощью нельзя расшифровать им же зашифрованные данные, для этого нужен private-ключ. Подобный способ обсуждался разработчиками phpBB (см., например, http://area51.phpbb.com/phpBB/viewtopic ... 84&t=33024), но не думаю, что до версии 4 что-то будет сделано, хотя желание видеть такое в версии 3.1 было высказано. Однако, никто не мешает сделать (и использовать) такой мод.

Данный подход не гарантирует "абсолютную" защиту и неоднократно критиковался, дискуссии легко найти в сети, но достаточно весомых аргументов ни в одной из них я так и не нашёл...

Алгоритм работы мода:
  • хук-функция проверяет наличие на странице форм (возможно связанных с вводом паролей) по наличию определений S_FORM_TOKEN и S_LOGIN_ACTION, а также наличие DEBUG_OUTPUT, если нет - пароли шифроваться не будут
  • хук-функция генерирует пару ключей (private, public) и сохраняет их в базе данных
  • хук-функция добавляет на страницы (в DEBUG_OUTPUT) код javascript, ответственный за шифрование паролей (поиск тэгов "input" типа "password" в формах, добавление "onsubmit" к подходящим тэгам "form" и функции шифрования, дополнительного тэга "input" типа "hidden" со справочной информацией); таким образом, при передаче формы на сервер вместо паролей будет передан зашифрованный текст
  • при приёме запроса POST анализируется наличие зашифрованных паролей; при из наличии пароли расшифровываются и подменяются в запросе для дальнейшего использования
Установка

1) Мод добавляет на все страницы с формами код javascript, это выполняет хук hook_encrypt_passwords.php, добавляя код в DEBUG_OUTPUT. Поэтому следует убедиться в наличии DEBUG_OUTPUT в стилях и при отсутствии восстановить.

Если Вы используете мобильный стиль, то следует выполнить следующее:

В мобильных стилях не определен DEBUG_OUTPUT, используемый модом. Ршение проблемы:

- проверить, определена ли в overall_footer.html DEBUG_OUTPUT

- если нет, то добавить строку

Код: Выделить всё

<!-- IF DEBUG_OUTPUT -->{DEBUG_OUTPUT}<!-- ENDIF -->
предпочтительно в блок

Код: Выделить всё

<div class="copyright">
или для стиля Artodia после

Код: Выделить всё

Powered by <a href="http://www.phpbb.com/">phpBB</a> &copy; phpBB Group.
2) Создать таблицу в базе данных (префикс "phpbb_" замените на требуемый), выполнив SQL-запрос:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `phpbb_encrypt_passwords` (
	`ep_id` int(11) unsigned NOT NULL auto_increment,
	`time` int(11) unsigned NOT NULL default '0',
	`privatekey` text collate utf8_bin NOT NULL default '',
	PRIMARY KEY  (`ep_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=0;
3) Добавить в includes/constants.php перед "?>":

Код: Выделить всё

// Begin Encrypt Passwords Mod
define('ENCRYPT_PASSWORDS_TABLE', 			$table_prefix . 'encrypt_passwords');
define('ENCRYPT_PASSWORDS_SESSION_LIFE', 	3600);
// End Encrypt Passwords Mod
4) Добавить в common.php перед "?>":

Код: Выделить всё

// Begin Encrypt Passwords Mod
// Get form data
$ep_openssl_ext = function_exists('openssl_private_decrypt') ? true : false;
for ( $ep_index=0; $ep_index<4; $ep_index++ )
{
	if ( request_var('encrypt_passwords_' . $ep_index,'') == '' ) continue;
	if ( !$ep_openssl_ext && !isset($ep_id) )
	{
		require_once($phpbb_root_path . 'includes/encrypt_passwords/phpseclib/Crypt/RSA.' . $phpEx);
		$ep_rsa = new Crypt_RSA();
		$ep_rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
	}
	$ep_name = explode(':',$_POST['encrypt_passwords_' . $ep_index]);
	$ep_idn = (int) $ep_name[0];
	$ep_inputname = $ep_name[1];
	$ep_b64ep = request_var($ep_inputname,'');
	if ( !empty($ep_idn) && !empty($ep_b64ep) )
	{
		if ( !isset($ep_id) || ($ep_idn != $ep_id) )
		{
			$sql = 'SELECT * FROM ' . ENCRYPT_PASSWORDS_TABLE . ' WHERE ep_id = ' . $ep_idn;
			$result = $db->sql_query($sql);
			if ( $row = $db->sql_fetchrow($result) )
			{
				$ep_privatekey = $row['privatekey'];
			}
			$db->sql_freeresult($result);
		}
		if ( isset($ep_privatekey) )
		{
			$ep_id = $ep_idn;
			$ep_ep = base64_decode($ep_b64ep);
			$ep_dp = '';
			if ( !$ep_openssl_ext )
			{
				$ep_rsa->loadKey($ep_privatekey);
				$ep_dp = $ep_rsa->decrypt($ep_ep);
			}
			else
			{
				$ep_openssl_privatekey = @openssl_get_privatekey($ep_privatekey);
				@openssl_private_decrypt($ep_ep,$ep_dp,$ep_openssl_privatekey);
				@openssl_free_key($ep_openssl_privatekey);
			}
			if ( empty($ep_dp) ) $ep_dp = '';
			$_POST[$ep_inputname] = $ep_dp;
			$GLOBALS['_REQUEST'][$ep_inputname] = $ep_dp;
			// debug...
			//	$mes = 'id = ' . $ep_id . '<br />inputname = ' . $ep_inputname . '<br />b64ep = ' . $ep_b64ep . '<br />dp = ' . $ep_dp . '<br />privatekey = ' . $row['privatekey'] . '<br />';
			//	trigger_error($mes);
		}
	}
}
// Delete old sessions
if ( isset($ep_id) )
{
	$sql = 'DELETE FROM ' . ENCRYPT_PASSWORDS_TABLE . ' WHERE ep_id = ' . $ep_id . ' OR time < ' . (time() - ENCRYPT_PASSWORDS_SESSION_LIFE);
	$db->sql_query($sql);
}
// End Encrypt Passwords Mod
5) При необходимости в файл includes/hooks/hook_encrypt_passwords.php можно внести следующие изменения по части:
  • длины ключа (с уменьшением уровня безопасности, но это может потребоватся, если Вы используете маломощный сервер); найти

    Код: Выделить всё

    	public $bits = 1024;
    и ЗАМЕНИТЬ 1024 на 512.
  • выдачи отладочной информации (только пользователям с правами Администратора); для отключения найти

    Код: Выделить всё

    		private $debug = true;
    и заменить значение на false

    Отладочная информация выдаётся при включенной в config.php опции DEBUG внизу экрана (строка с всплывающей подсказкой с именем мода и номером версии) в формате

    Код: Выделить всё

    	hEP Time : 0.000s
    где Time - время выполнения хук-фунции.
    ...
    ВНИМАНИЕ !!! Из-за специфики hook system phpBB стандартная отладочная информация выдаётся без учёта времени выполнения хук-функций и количества выполненных в них sql-запросов
    ...
6) Копировать файлы из root.encrypt_passwords/ с сохранением дерева каталогов в:

Код: Выделить всё

includes/encrypt_passwords/phpseclib/openssl.cnf
includes/encrypt_passwords/phpseclib/Crypt/RSA.php
includes/encrypt_passwords/phpseclib/Crypt/Hash.php
includes/encrypt_passwords/phpseclib/Crypt/Random.php
includes/encrypt_passwords/phpseclib/Crypt/Math/BigInteger.php
includes/hooks/hook_encrypt_passwords.php
styles/jsencrypt.min.js
7) Очистить кэш.


Примечания

1) Поскольку передаваемый пароль подменяется на зашифрованный, функция браузера "запомнить пароль" может не работать, если используется устаревший браузер. В современные браузерах проблем не возникает.

2) Для создания ключей на стороне сервера используется phpseclib. Для шифрования на стороне клиента используется jsencrypt. Для расшифровки на стороне сервера используется расширение php openssl или, если оно не установлено, phpseclib (в этом случае дешифрование идёт не очень быстро, на слабом сервере может исчисляться единицами секунд, так, у меня тестовая площадка собрана на маршрутизаторе и дешифрование занимает около 5 секунд при загрузке процессора 25%).


ВНИМАНИЕ !!! Алоритм шифрования в текущей версии не претендует на абсолютное совершенство. Поскольку отладка проводилась на слабом сервере, некоторое дополнительные меры по обеспечению безопасности не были применены. Желающие могут дополнить мод...

Спасибо Shredder'у за тестирование и оформление мода в формате MODX ! Спасибо maco8024 за тестирование ! Скачать MODX можно здесь

Тема на моей тестовой площадке тынц



Скачать:
encrypt_passwords_v_1_0_5.zip
(78.64 КБ) 215 скачиваний
Скачать предыдущие версии:
encrypt_passwords_v_1_0_4.zip
(78.53 КБ) 198 скачиваний
encrypt_passwords_v_1_0_3.zip
(78.53 КБ) 216 скачиваний
encrypt_passwords_v_1_0_2.zip
(75.6 КБ) 213 скачиваний
Последний раз редактировалось c61 20.03.2014 17:40, всего редактировалось 6 раз.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 15 лет
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 4 раза
Поблагодарили: 352 раза
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение MIT »

c61 писал(а):Спасибо Shredder'у за тестирование и оформление мода в формате MODX !
А где оно, собственно?.. В архиве txt инструкция.

Есть пара замечаний.
c61, посмотри внимательно на этот код:
c61 писал(а):

Код: Выделить всё

	$ep_name = explode(':',$_POST['encrypt_passwords_' . $ep_index]);
	$ep_id = (int) $ep_name[0];
	$ep_inputname = $ep_name[1];
	if ( isset($_POST[$ep_inputname]) )
Он нехороший — слишком мало проверок входящих данных.
c61 писал(а):

Код: Выделить всё

$GLOBALS['_REQUEST']
Массив _REQUEST тоже является суперглобальным.
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение Shredder »

MIT писал(а):А где оно, собственно?.. В архиве txt инструкция.
На моём сайте в версии 1.0.1
Если автор предоставит список изменений, обновлю до 1.0.2

Добавлено спустя 2 минуты 17 секунд:
MIT писал(а):слишком мало проверок входящих данных.
Речь об этом куске, что нужно использовать там request_var, правильно я понимаю?

Код: Выделить всё

	$ep_name = explode(':',$_POST['encrypt_passwords_' . $ep_index]);
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 15 лет
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 4 раза
Поблагодарили: 352 раза
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение MIT »

Shredder писал(а):нужно использовать там request_var, правильно я понимаю?
Лучше использовать именно массив _POST, так как функция request_var смотрит ещё и в _GET. С точки зрения безопасности, это не совсем верно для данной ситуации.

Я говорю о том, что:
— значение по этому индексу может не содержать символа :, а значит код $ep_name[1] выдаст нотис.
— нет проверки на тип передаваемых данных — в массиве _POST может оказаться массив, а не строка. При попытке применения строковых функций к массиву возникнет предупреждение. is_string рулит. Это же касается куска кода

Код: Выделить всё

			$ep_b64ep = $_POST[$ep_inputname];
			$ep_ep = base64_decode($ep_b64ep);
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

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

Если кого-либо мод заинтересует, внесу предлагаемые правки и ещё кое-что.

Если есть заинтересованность - прошу сообщить.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 15 лет
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 4 раза
Поблагодарили: 352 раза
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение MIT »

c61, правки внести надо конечно, ведь мало кто будет читать тему из тех, кто захочет поставить мод. Недочёт в коде, всё-таки является уязвимостью, пусть и небольшой — Path disclosure.
c61 писал(а):совершенства пока нет
Стремись, у тебя неплохо получается ;)
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

MIT писал(а):...у тебя неплохо получается
У тебя вроде тоже неплохо...

А у меня уже 35 лет программировать неплохо получается )) Если бы было достаточно времени и десяток единомышленников - переделал бы этот phpbb полностью нафиг.

По недочётам в коде - они не такие уж существенные. Если я сам за 10 минут не взломал, значит, недочёты можно и потом поправить, когда время будет.
Последний раз редактировалось c61 27.02.2014 14:02, всего редактировалось 1 раз.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 15 лет
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 4 раза
Поблагодарили: 352 раза
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение MIT »

c61 писал(а):переделал бы этот phpbb полностью
Не ты один...
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение Shredder »

c61 писал(а):Если кого-либо мод заинтересует, внесу предлагаемые правки и ещё кое-что.

Если есть заинтересованность - прошу сообщить.
Меня интересует обновление мода, чтобы люди не качали старые версии) А то сделал обновление тихим сапом, и ничего никому не написал)
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение Алг »

MIT писал(а):
c61 писал(а): Если бы было достаточно времени и десяток единомышленников - переделал бы этот phpbb полностью
Не ты один...
Так "этот phpbb" как раз два израильских перцапрограммиста и переделали в тот вид, которым мы пользуемся. Вот и вас уже двое :)
а шифрование меня, наверное, интересует
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

Shredder писал(а):Меня интересует обновление....
Вот ведь какой недоверчивый... Можно подумать, что я бы тебе не сказал ни слова, внеся изменения в код.

Всего-навсего обновлён readme.txt, куда добавлена информация (о фокусах с галереей), что была опубликована на твоей конференции (плюс ещё кое-какая информация из постов). А также исправлена некоторая неточность установки, не влияющая на работу мода. Поэтому был увеличен номерок версии. Сейчас readme.txt соответствует тому, что в стартовом посте этой темы.
Алг писал(а):а шифрование меня, наверное, интересует
Тогда данный мод ставлю в очередь на улучшения. Он всего-то пятый) А если есть желание и возможности, буду только рад, если Вы сами что-то улучшите ! Если требуется обсуждение - его лучше проводить у Shredder'а, если он не против, потому что здесь наверняка нафлудим и нафлеймим)
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение Shredder »

c61 писал(а):Вот ведь какой недоверчивый... Можно подумать, что я бы тебе не сказал ни слова, внеся изменения в код.
Ну мало ли... Ты сам написал, что:
c61 писал(а):какие отличия от 1.0.2 я не помню
c61 писал(а):Если требуется обсуждение - его лучше проводить у Shredder'а, если он не против, потому что здесь наверняка нафлудим и нафлеймим)
Я-то не против, только за :D Хотя каким образом мой сайт исключает флуд или флейм, так и не понял.
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

Выпущена версия 1.0.3. Изменения:
  • обновлена библиотека phpseclib
  • добавлена возможность выдачи отладочной информации о времени выполнения
  • добавлена возможность использования ключей 512 бит
  • небольшие улучшения по части безопасности
P.S. Ключ 512 бит обрабатывается в три-четыре раза быстрее, чем 1024. Применимость - для слабых серверов.
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 11 лет 3 месяца
Благодарил (а): 42 раза
Поблагодарили: 251 раз
Контактная информация:

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение c61 »

Выпущена версия 1.0.4. Исправления в инструкции установки: были ошибочно заменены на

Код: Выделить всё

[b]1)[/b]
в трёх местах.
PAW
phpBB 1.4.3
Сообщения: 93
Стаж: 14 лет
Благодарил (а): 14 раз

Re: [BETA] шифрование паролей - encrypt passwords

Сообщение PAW »

Здравствуйте. Возникла проблема после установки данного мода. Перестал работать Simple Chat 2014 — AJAX чат с оповещениями о новых темах
Вместо чата, выводимого в iframe:

Код: Выделить всё

Fatal error: require_once() [function.require]: Failed opening required './includes/encrypt_passwords/phpseclib/Crypt/RSA.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/***/data/www/***/includes/hooks/hook_encrypt_passwords.php on line 83
Error 64: require_once() [function.require]: Failed opening required './includes/encrypt_passwords/phpseclib/Crypt/RSA.php' (include_path='.:/usr/share/php:/usr/share/pear') at file /var/www/***/data/www/***/includes/hooks/hook_encrypt_passwords.php line 83
На 83 строке в файле /includes/hooks/hook_encrypt_passwords.php:

Код: Выделить всё

require_once($path :'includes/encrypt_passwords/phpseclib/Crypt/RSA.php');
, файл RSA находится в указанном месте (includes/encrypt_passwords/phpseclib/Crypt/RSA.php)
Помогите найти решение этой проблемы.
Закрыто

Вернуться в «Бета-версии модов для phpBB 3.0.x»