Шифрование паролей в передаваемых формах

В phpBB пароли передаются "открытым текстом", так почему бы не использовать алгоритм RSA ?

Хаки, скрипты, BB-коды и другие вещи, не оформленные в виде полноценных модов, но способствующие улучшению функциональности движка.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

Шифрование паролей в передаваемых формах

Сообщение c61 »

Не секрет, что данные форм (в том числе пароли) отправляются на сервер незашифрованными. Поскольку использование протокола 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 было высказано. Однако, никто не мешает сделать такой мод.

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

Итак, что потребуется:
  • библиотека шифрования для php (см., например, http://phpseclib.sourceforge.net/)
  • библиотека шифрования для javascript (любая поддерживающая ключи от 1024 бит, рекомендованные в настоящее время для RSA, например, http://www.ohdave.com/rsa/)
  • хук phpBB для вставки (например, в DEBUG) javascript исправления форм с input type password и алгоритма шифрования с public-ключом
Разумеется, на стороне клиента должен быть включен javascript, если же нет - легко учесть этот факт.

Общее описание алгоритма (черновик):
  • при генерации страницы хук-функцией (при необходимости) генерируется пара ключей, private-ключ сохраняется в данных сессии (в таблице базы данных), на страницу добавляется код javascript, включающий функцию шифрования с public-ключом и модифицирующий событие onsubmit input type password с указанием этой функции (для password в phpBB onsubmit не используется нигде, так что конфликты маловероятны)
  • при отправке формы пароль шифруется, при приёме формы на стороне сервера анализируется, зашифрован ли password или нет, и если да - расшифровывается с использованием private-ключа, причём сделать это можно централизованно - в одном месте, подменив полученные зашифрованные данные POST-запроса на расшифрованные))
Искал подобный мод для phpBB, но не нашёл, а запросы имеются.

Обсуждать мод на гуру не имею никакого желания.

Предлагаю поразмыслить на тему совместной разработки, тем более, что алгоритм ясен и серьёзных трудностей, на мой взгляд, не предвидится. Полностью делать мод самому - нет времени.
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

Шифрование паролей в передаваемых формах

Сообщение Shredder »

Да, вполне можно над этим подумать. Сейчас есть дела, как только освобожусь, ознакомлюсь более подробно.
private-ключ сохраняется в данных сессии
То есть, для каждого пароля будет свой ключ?
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

Шифрование паролей в передаваемых формах

Сообщение c61 »

Shredder писал(а):То есть, для каждого пароля будет свой ключ?
Предлагается, чтобы для каждого случая, когда требуется шифрование, генерировалась новая пара ключей (это не занимает много времени). Таким образом, private и public-ключи всегда новые.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

Шифрование паролей в передаваемых формах

Сообщение c61 »

Сделал тестовую версию 1.0.0, можно скачать и ознакомиться. См. readme.txt в архиве. Проверял на своей тестовой площадке, обнаружил, что дешифрование на стороне сервера идёт не шибко быстро, на слабом сервере может исчисляться единицами секунд, но это не страшно (потоков/процессов наверняка у сервера несколько; у меня тестовая площадка собрана на маршрутизаторе, так дешифрование около 5 секунд при загрузке процессора 25%).

Желательно поискать баги. Шифруются все пароли, в том числе в админке, так что желательно проверить все возможные места...

Encrypt passwords mod v.1.0.0:
encrypt_passwords_v_1_0_0.zip
(76 КБ) 1139 скачиваний
encrypt_passwords_v_1_0_0.zip
(76 КБ) 1139 скачиваний
P.S. Текст readme.txt и ссылку на скачку разместил также на своей тестовой площадке.

Добавлено спустя 17 часов 8 минут 39 секунд:
Для ускорения дешифрования на стороне сервера можно использовать утилиту openssl (openssl-util; если установлена на сервере и разрешена функция exec php). Расшифровка идет намного быстрее, чем средствами phpseclib. По замерам на моей тестовой площадке - доли секунды вместо нескольких секунд выполнения phpseclib.

Пример:

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

<<?php
unlink('file');
system('openssl rsautl -in file.cr -out file -inkey private -decrypt');
if ( ($file = file_get_contents('file')) === false )
{ echo "ERROR !"; }
else
{ echo "<pre>$file</pre>"; }
?>
где:
  • file.cr - файл с зашифрованным паролем (двоичный, после base64_decode)
  • file - файл с дешифрованным паролем
  • private - файл с private-ключом
Возможен вариант с настройками мода в админке - использовать phpseclib (медленно) или внешнюю программу дешифрования (более эффективно).

Добавлено спустя 7 часов 3 минуты 31 секунду:
Добавил дешифрование с использованием расширения php openssl, процесс так же быстр, как при использовании утилиты openssl. Если расширение установлено, то используется, если нет - то медленный phpseclib.

См.v.1.0.1:
encrypt_passwords_v_1_0_1.zip
(76.34 КБ) 4888 скачиваний
encrypt_passwords_v_1_0_1.zip
(76.34 КБ) 4888 скачиваний
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

Шифрование паролей в передаваемых формах

Сообщение Shredder »

Создал инструкцию в формате MODX, начал тестировать мод. Сразу заметил одну вещь: при посещении почти любой из страниц форума создаётся отдельная запись в таблице мода, даже если эту страницу уже посещали. Так и должно быть?
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

Шифрование паролей в передаваемых формах

Сообщение c61 »

Shredder писал(а):...при посещении почти любой из страниц форума создаётся отдельная запись в таблице мода, даже если эту страницу уже посещали. Так и должно быть?
Да. Запись создаётся потому, что хук-функция определила наличие на странице вероятную форму с запросом пароля. А вот будет ли она использована и есть ли на самом деле необходимость - решает javascript.

В этом недостаток используемого алгоритма, и неплохо было бы придумать, как его устранить.

Казалось бы, для уменьшнния нагрузки на базу данных лучше сделать так, чтобы javascript, определив наличие input password и необходимость добавления onsubmit к форме, выполнял запрос к серверу на получение public-ключа. И только в этом случае создавалась бы запись в таблице базы данных. Но такой подход плох тем, что появляется лишний сеанс, который тоже надо шифровать, да и сервер будет выступать в роли поставщика ключей, что может плохо закончиться)
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

Шифрование паролей в передаваемых формах

Сообщение Shredder »

Насколько я понял, при раскомментировании отладочных строк в common.php в строке b64ep показывается зашифрованный пароль, переданный на сервер, а в dp - расшифрованный? Если да, то протестировал во всех пяти основных браузерах: Опера, FF, Сафари, Хром, и IE с 6 по 8 версию, отклонений в работе не обнаружил.
test.png
Шифруется, на первый взгляд, тоже везде: при вводе пароля с главной страницы или со страницы авторизации, при смене пароля администратором в ACP или при смене самим пользователем в личном разделе.
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

Шифрование паролей в передаваемых формах

Сообщение c61 »

Shredder писал(а):Насколько я понял, при раскомментировании отладочных строк в common.php в строке b64ep показывается зашифрованный пароль, переданный на сервер, а в dp - расшифрованный?
Ага, без строчек для отладки я долго не мог найти пару простейших ошибок, вот их и воткнул туда.
Shredder писал(а):...протестировал во всех пяти основных браузерах: Опера, FF, Сафари, Хром, и IE с 6 по 8 версию, отклонений в работе не обнаружил.
Отлично, thnks ! Уж если в IE6 работает, то даже удивительно))
Shredder писал(а):Шифруется, на первый взгляд, тоже везде: при вводе пароля с главной страницы или со страницы авторизации, при смене пароля администратором в ACP или при смене самим пользователем в личном разделе.
Вот и прекрасно. При входе в АСР с подтверждением проблем не должно быть.

В таблице базы данных запись висит 1 час, потом удаляется. Если форма пароля провисела на экране больше часа - авторизация будет неудачной. Наверно надо в javascript приделать переход (через 59 минут) на сообщение типа "данные формы устарели, повторите ввод". Подумаю...
Shredder
Администратор
Сообщения: 1069
Зарегистрирован: 22.08.13 09:05
Благодарил (а): 132 раза
Поблагодарили: 264 раза
Контактная информация:

Шифрование паролей в передаваемых формах

Сообщение Shredder »

Состоялся первый релиз мода в формате MODX, поэтому данную тему я закрываю, все дальнейшие обсуждение будут вестись в новой: Шифрование паролей (Encrypt Passwords)
Мои моды и расширения для phpBB
Выполняю работы по phpBB3 на заказ. Пишите в личку или на почту.
Бесплатная поддержка - только в темах.
Закрыто