С тех пор, как занимаюсь написанием собственного движка (пока для английской версии), подумываю о переносе на него данных с текущего uWeb CMS (по сути тот же uCoz). Само собой, что перенос данных вручную при наличии нескольких сотен материалов — процесс крайне трудоёмкий. Поэтому хотелось бы его автоматизировать.
Как известно, в системах uCoz/uWeb есть возможность создания файла бекапа, а также последующего восстановления данных из него. Кроме всего прочего, в архиве бекапа находятся и текстовые файлы, содержащие в себе значения полей базы данных uCoz. Как правило, это значения из таблиц материалов, комментариев, пользователей и т. д. Каждая строка в таком файле бекапа отвечает за определенный материал; значения параметров разбиты разделителем «|». Так что, предварительно определив последовательность полей, не представляет большого труда написать скрипт, импортирующий в ту же БД MySQL данные из таких текстовых файлов.
Однако, есть одно «но» и связано оно с бекапом таблицы пользователей. Пароли в базах данных, как вправило, хранятся в зашифрованном виде, и БД uCoz — не исключение. Таким образом, даже имея на руках таблицу БД, обычно невозможно определить, у какого пользователя какой пароль — в БД хранится только его хэш. Однако, это не значит, что пользователей нельзя экспортировать с паролями — вполне можно импортировать в БД эти хэши, а затем, как это обычно и делается, при входе пользователя сравнивать хэш введённого им пароля и хэш в БД. Для этого нужно только одно — знать алгоритм хэширования.
В бекапе пользователей uCoz третьим значением идёт строка, например, вот такая: $1$SIq1$Z7ujk8SsSwv/TCxmI6NzT0. Именно это значение и является хэшем пароля пользователя. Далее, как уже было сказано, встаёт вопрос: что это за хэш и как он получен? Я начал рыться в сети и обнаружил несколько страниц, где рассказывалось о скриптах (PHP), позволяющих импортировать бекап пользователей uCoz в БД движков Wordpress, Joomla, Drupal. Таким образом, мне стало очевидно, что алгоритм шифрования известен, по крайней мере разработчикам этих плагинов-скриптов.
Однако, проанализировав такие скрипты, я не смог сразу определить алгоритм хэширования. Тогда я решил обратиться в поддержку uWeb — раз алгоритм уже фактически доступен, они вполне могут мне его описать. После первых вопросов последовал ответ:
«Расшифровать пароль не представляется возможным и по понятным причинам нам также запрещено вдаваться в подробности обсуждения алгоритма шифрования паролей».
Однако, когда я объяснил, что хочу не расшифровать пароли, а просто экспортировать пользователей на другой проект, консультант взялся мне помочь, пообещав проконсультироваться у коллег.
И тут на одном из форумов я случайно наткнулся на расшифровку этой самой строки. Как оказалось, она представляет собой стандартный хэш Unix, получаемый в PHP функцией crypt(), а $1$*$ (* — любые символы) — это соль.
Я решил проверить данную теорию. Для этого я попробовал хешировать свой пароль, взяв соль из хеша uCoz, что выглядело примерно так: crypt('my_pass', '$1$SIq1$');, после чего сравнил результат с хэшем uCoz. И — бинго! —точное совпадение.
Но забавней всего, что вскоре последовал ответ техподдежки uWeb:
«Увы, такой возможности нет и быть не может».
Что ж, теперь им осталось только заблокировать мой аккаунт за разглашение конфиденциальной информации осуществление невозможного. И тем самым ускорить переезд на новый движок, на котором, как вы уже поняли, не надо будет заново регистрироваться :)
Информация от спонсора
Интерактивная проекция: нестандартные формы подачи информации. На сайте компании Вы можете ознакомиться с новой разработкой — интерактивным столом для детей, позволяющим использовать его в качестве сенсорной мультитач поверхности — в развивающих играх, программах и любых других приложениях.