Тема: Хеширование паролей в БД

Доброго времени суток.
Встал вопрос интеграции стороннего веб приложения с ImageCMS а именно миграции пользователей.
Искал но не нашел функцию хеширования паролей.
Не подскажите?

Thumbs up Thumbs down

2

Re: Хеширование паролей в БД

Смотрите библиотеку DX_Auth.

/application/libraries/DX_Auth.php

Когда то разрабатывал модули для ImageCMS Corporate

3

Re: Хеширование паролей в БД

Спс, все нашел, но так и не понял как все это работает.
Для каждого пользователя генерируется уникальный ключ, но вот как его использовать я так и не понял.
Пока что учусь работать с БД и не до конца понял данный алгоритм.
Если не сложно кому либо на пальцах показать как завернуть пароль в хэш и  сгенерировать для него ключ по этому алгоритму.

с joomla было проще sad

Thumbs up Thumbs down

4

Re: Хеширование паролей в БД

Смотрите в этой библиотеке функции 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)
Когда то разрабатывал модули для ImageCMS Corporate

5

Re: Хеширование паролей в БД

Это понятно что пароли хранятся в хешированном виде.

я вот как раз с этой функцией и не разобрался

    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);
    }

Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.

Thumbs up Thumbs down

6 Отредактировано Sempai (02-10-2016 13:07:48)

Re: Хеширование паролей в БД

RYUMASHKIN пишет:

Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.

Если бы это было так, ни один пользователь не смог бы пройти авторизацию wink

Для проверки можете разместить следующий код в шаблоне страницы и обновите ее, хэш не изменится.

{$psw = $CI->load->library('dx_auth')->_encode('ваш_пароль');}
    
{echo $psw}
Когда то разрабатывал модули для ImageCMS Corporate

7

Re: Хеширование паролей в БД

Поправьте меня если ошибусь.
Сначала идет проверка и сели значение 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);
//и вот что сделать нужно дальше? 

Thumbs up Thumbs down

8

Re: Хеширование паролей в БД

Sempai пишет:
RYUMASHKIN пишет:

Я просто не пойму как работает данная функция что на выходе, для одного и того же пароля получаются разные хеши.

Если бы это было так, ни один пользователь не смог бы пройти авторизацию wink

Для проверки можете разместить следующий код в шаблоне страницы и обновите ее, хэш не изменится.

{$psw = $CI->load->library('dx_auth')->_encode('ваш_пароль');}
    
{echo $psw}

это понятно, но я ради интереса смотрел на локалке, регистрирую нового пользователя с одним и тем же паролем, и в БД хеш записан по разному.

Thumbs up Thumbs down

9

Re: Хеширование паролей в БД

вот три разхных хеша, регистрировал через imagecms
для одного и того же пароля.

$1$RHv0gO4C$0.po4LKbkPVxA4btILD8S0
$1$jozGdEEx$OHZZjVnKbQgLfaTbIkAjQ.
$1$S4mZipvg$6ynfpvs9J5ufLPpSfo8QR1

но в таблице users еще есть столбец key
вот в том же порядке значения для этих трех пользователей

6ZycA
1r3Hy
6EZ1s

За исключением первого созданного пользователя.
Для которого я предполагаю и используется длинный ключ из конфига. Потому и хеши разные. Но трюк в том что в функции про это ни слова.

Thumbs up Thumbs down

10

Re: Хеширование паролей в БД

RYUMASHKIN пишет:


Как в мою базу происходит процесс я понимаю, и теперь как захеширвоать пароль в бузу imagecms

//переменная в которую я принимаю новый пароль
$newpass = 'newpass'
//ключ из конфига imagecms
$key = encryption_key'';
// дальше мы складываем наши переменные в строку 
$_password = $key . $newpass;
//после я преобразую это значение в массив
$_pass = str_split($_password);
//и вот что сделать нужно дальше? 

Я бы не лез в дебри функций, а просто дополнил бы существующие методы системы.
К примеру для синхронизации ваших пользователей, с ImageCMS в модуле auth, есть метод login.
В этом методе, перед валидацией введенных данных организуйте проверку email с вашей базой пользователей, если есть совпадения, заносите пользователя в систему используя данные с вашей базы (email и password) у вас уже есть.
Как занести данные пользователя включая хеширование пароля, посмотрите в методе register (в этом же модуле ниже).

Когда то разрабатывал модули для ImageCMS Corporate