Как заставить Drupal 7 хранить пароли в md5, а не в sha512?

Главные вкладки

Аватар пользователя mnv mnv 31 августа 2011 в 1:26

Сразу скажу, что пока что решил задачу с помощью "костыля", изменил функцию user_hash_password в файле includes/password.inc.

<?php
function user_hash_password($password$count_log2 0) {
  if (empty(
$count_log2)) {
    
// Use the standard iteration count.
    
$count_log2 variable_get('password_count_log2'DRUPAL_HASH_COUNT);
  }
  return 
md5($password); //Добавил
  //return _password_crypt('sha512', $password, _password_generate_salt($count_log2)); //Было
}
?>

Подскажите, есть ли культурный способ, можно ли, например, как-то переопределить эту функцию в модуле?

Комментарии

Аватар пользователя mnv mnv 31 августа 2011 в 9:20

Зачем в md5 или зачем более культурно?)
В md5 надо для интеграции со сторонним приложением. Пользователь регистрируется в Drupal и получает аккаунт в другом приложении. Надо, чтобы он мог логиниться под тем же логином и паролем. Там пароли хранятся в md5.
А культурно, чтобы после установки модуля не надо было ничего допиливать.

Аватар пользователя vgoodvin vgoodvin 31 августа 2011 в 9:52

"mnv" wrote:
В md5 надо для интеграции со сторонним приложением. Пользователь регистрируется в Drupal и получает аккаунт в другом приложении. Надо, чтобы он мог логиниться под тем же логином и паролем. Там пароли хранятся в md5.
А культурно, чтобы после установки модуля не надо было ничего допиливать.

Все это можно сделать и без костылей. Разве нельзя при регистрации пользователя на друпал-сайте передать его данные, включая оригинальный пароль, на стороннее приложение? Перехватить в хуках оригинальный пароль можно (или уже нет?). Проблема безопасности не стоит, т.к. данные передаются внутри сервера.

Аватар пользователя mnv mnv 31 августа 2011 в 10:15

Уже пробовал перехват оригинального пароля, но к сожалению в модуль пароль приходит уже в виде хеша. В оригинальном виде доступен только старый пароль (при изменении пароля).

Аватар пользователя vgoodvin vgoodvin 31 августа 2011 в 12:22

Как перехватывали? Через hook_user наверное.
Добавьте свой submit-handler в форму регистрации и в форму редактирования учетной записи примерно вот так:

function my_module_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'ENTER CORRECT FORM_ID HERE') {
    array_unshift($form['#submit'], 'MY_SUBMIT_CALLBACK_NAME');
  }
}

В своем хендлере можете перехватить сырые данные.

Я как-то делал подобную операцию, давно правда. Исходники не сохранились, заглянуть не смогу.

Аватар пользователя mnv mnv 1 сентября 2011 в 1:28

К сожалению в function MODULE_form_user_profile_form_alter(&$form, &$form_state) пароль приходит уже хешированным. В 6-м друпале как я помню в этих обработчиках он действительно был в открытом виде.

Аватар пользователя mnv mnv 1 сентября 2011 в 19:36

cracker@drupal.org, на этапе валидации тоже хеш. Не проверял, но скорее всего с браузера пароль уже в виде хеша приходит, это было бы логично с точки зрения безопасности.
RxB, спасибо за ссылку, возможность интересная, но это вариант наподобие OpenID. Т.е. надо такую возможность (отдельную форму логина) реализовывать еще и в системе, с которой интегрируется Drupal. К тому же, пользователь, регистрируясь в Drupal, не будет при этом экспортироваться с правильным паролем во внешнюю базу.
Если править стороннюю систему, то интеграцию можно сделать более гладко, но это займет побольше времени... Нет аккуратных вариантов получить md5 пароля в Drupal 7?

Аватар пользователя mnv mnv 4 сентября 2011 в 4:43

Спасибо всем за рекомендации. Сделали в итоге так. user_hash_password менять не стали. Авторизация во внешней базе происходит без повторного ввода логина-пароля, по клику на специальную ссылку в Drupal. Из этой страницы идёт запрос в форму логина во внешнюю систему, которую пришлось тоже слегка доработать для этого.

Аватар пользователя SergO SergO 22 января 2012 в 4:10

не надо ничего переопределять и переводить в md5:

<?php
// $password - введённый пароль
// $stored_hash - хеш из базы
function validatePassword($password$stored_hash) {
  include_once 
$path_to_drupal7_root.'/includes/password.inc';
  
$hash _password_crypt('sha512'$password$stored_hash);
  return 
$stored_hash == $hash;
}
?>