Тема: Хеширование паролей в БД
Доброго времени суток.
Встал вопрос интеграции стороннего веб приложения с ImageCMS а именно миграции пользователей.
Искал но не нашел функцию хеширования паролей.
Не подскажите?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум вебмастеров - сообщество ImageCMS → Функции ядра → Хеширование паролей в БД
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго времени суток.
Встал вопрос интеграции стороннего веб приложения с ImageCMS а именно миграции пользователей.
Искал но не нашел функцию хеширования паролей.
Не подскажите?
Смотрите библиотеку DX_Auth.
/application/libraries/DX_Auth.php
Спс, все нашел, но так и не понял как все это работает.
Для каждого пользователя генерируется уникальный ключ, но вот как его использовать я так и не понял.
Пока что учусь работать с БД и не до конца понял данный алгоритм.
Если не сложно кому либо на пальцах показать как завернуть пароль в хэш и сгенерировать для него ключ по этому алгоритму.
с joomla было проще
Смотрите в этой библиотеке функции register и login.
При создании пользователя пароль заносится в базу в хешированном виде.
'password' => crypt($this->_encode($password))
В дальнейшем при входе в систему введенный пароль хешируется по тому же принципу и сравнивается с сохраненным в базе.
$password = $this->_encode($password);
$stored_hash = $row->password;
// Is password matched with hash in database ?
if (crypt($password, $stored_hash) === $stored_hash)
Это понятно что пароли хранятся в хешированном виде.
я вот как раз с этой функцией и не разобрался
public function _encode($password) {
$majorsalt = '';
// if you set your encryption key let's use it
if ($this->ci->config->item('encryption_key') != '') {
// concatenates the encryption key and the password
$_password = $this->ci->config->item('encryption_key') . $password;
} else {
$_password = $password;
}
// if PHP5
if (function_exists('str_split')) {
$_pass = str_split($_password);
} // if PHP4
else {
$_pass = [];
if (is_string($_password)) {
for ($i = 0; $i < strlen($_password); $i++) {
array_push($_pass, $_password[$i]);
}
}
}
// encrypts every single letter of the password
foreach ($_pass as $_hashpass) {
$majorsalt .= md5($_hashpass);
}
// encrypts the string combinations of every single encrypted letter
// and finally returns the encrypted password
return md5($majorsalt);
}
Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.
Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.
Если бы это было так, ни один пользователь не смог бы пройти авторизацию
Для проверки можете разместить следующий код в шаблоне страницы и обновите ее, хэш не изменится.
{$psw = $CI->load->library('dx_auth')->_encode('ваш_пароль');}
{echo $psw}
Поправьте меня если ошибусь.
Сначала идет проверка и сели значение encryption_key не пустое то мы создаем переменную
$_password в которой просто в строку складываем наш encryption_key и password
если же значение encryption_key пустое то мы просто приравниваем
$_password = $password;
if ($this->ci->config->item('encryption_key') != '') {
$_password = $this->ci->config->item('encryption_key') . $password;
} else {
$_password = $password;
}
Тут мы преобразуем наше значение $_password в массив, на это мэтапе все в принципе понятно.
if (function_exists('str_split')) {
$_pass = str_split($_password);
А вот тут я не понимаю что происходит и как.
foreach ($_pass as $_hashpass) {
$majorsalt .= md5($_hashpass);
}
Что мне нужно при переносе.
В цикле я делаю выборку из БД
имя пользователя, email и инициирую для всех пользователей автоматически процедуру смены пароля. Тут я в принципе могу не мучиться и создать пользователя в таблице с любым значением хеша в поле пароля.
Отправляю пользователю письмо со ссылкой на смену пароля.
И вот это введенный пароль мне нужно будет захешировать в 2 базы.
Как в мою базу происходит процесс я понимаю, и теперь как захеширвоать пароль в бузу imagecms
//переменная в которую я принимаю новый пароль
$newpass = 'newpass'
//ключ из конфига imagecms
$key = encryption_key'';
// дальше мы складываем наши переменные в строку
$_password = $key . $newpass;
//после я преобразую это значение в массив
$_pass = str_split($_password);
//и вот что сделать нужно дальше?
RYUMASHKIN пишет:Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.
Если бы это было так, ни один пользователь не смог бы пройти авторизацию
Для проверки можете разместить следующий код в шаблоне страницы и обновите ее, хэш не изменится.
{$psw = $CI->load->library('dx_auth')->_encode('ваш_пароль');} {echo $psw}
это понятно, но я ради интереса смотрел на локалке, регистрирую нового пользователя с одним и тем же паролем, и в БД хеш записан по разному.
вот три разхных хеша, регистрировал через imagecms
для одного и того же пароля.
$1$RHv0gO4C$0.po4LKbkPVxA4btILD8S0
$1$jozGdEEx$OHZZjVnKbQgLfaTbIkAjQ.
$1$S4mZipvg$6ynfpvs9J5ufLPpSfo8QR1
но в таблице users еще есть столбец key
вот в том же порядке значения для этих трех пользователей
6ZycA
1r3Hy
6EZ1s
За исключением первого созданного пользователя.
Для которого я предполагаю и используется длинный ключ из конфига. Потому и хеши разные. Но трюк в том что в функции про это ни слова.
Как в мою базу происходит процесс я понимаю, и теперь как захеширвоать пароль в бузу imagecms//переменная в которую я принимаю новый пароль $newpass = 'newpass' //ключ из конфига imagecms $key = encryption_key''; // дальше мы складываем наши переменные в строку $_password = $key . $newpass; //после я преобразую это значение в массив $_pass = str_split($_password); //и вот что сделать нужно дальше?
Я бы не лез в дебри функций, а просто дополнил бы существующие методы системы.
К примеру для синхронизации ваших пользователей, с ImageCMS в модуле auth, есть метод login.
В этом методе, перед валидацией введенных данных организуйте проверку email с вашей базой пользователей, если есть совпадения, заносите пользователя в систему используя данные с вашей базы (email и password) у вас уже есть.
Как занести данные пользователя включая хеширование пароля, посмотрите в методе register (в этом же модуле ниже).
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум вебмастеров - сообщество ImageCMS → Функции ядра → Хеширование паролей в БД
Форум работает на PunBB, при поддержке Informer Technologies, Inc