[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перенос пользователей и паролей с изменениями
Lazy72
Добрый день! Уже долго бьюсь и не могу никак решить задачку:
Есть форум, на этом форуме есть юзеры. Надо перейти на новый форум со старыми юзерами. Но вот проблема - на старом форуме пароли хешировались в чистом md5, а на новом md5(md5($pass).salt)
Таким образом пароли надо переместить, изменив их хеширование на md5($user_pass.salt)
Вот тут я и застрял. Не получается значения массива захешировать.
Я уверен, что делаю это неправиль, т.к. подобного опыта до этого не было.
Вот пример именно этой части:

<?php
$salt='iwannasaltyou';
$array = array(1,2,3);
foreach($array as $value){
$hashed = md5($value . salt);
}
?>


Как можно решить эту проблему?



Спустя 7 минут, 49 секунд (29.01.2012 - 20:46) inpost написал(а):
Берёшь на форум и меняешь парочку строк, делаешь старый вид хеширования.

Спустя 2 минуты, 57 секунд (29.01.2012 - 20:49) Lazy72 написал(а):
Цитата (inpost @ 29.01.2012 - 17:46)
Берёшь на форум и меняешь парочку строк, делаешь старый вид хеширования.

Боюсь что этот вариант не подойдет, схему хеширования надо оставить.

Спустя 8 минут, 12 секунд (29.01.2012 - 20:57) inpost написал(а):
Зачем его менять? Какая необходимость?
md5 нельзя вернуть назад, поэтому не делай неправильных решений. Просто поменяй немного ядро форума и всё будет пучком.

Спустя 7 минут, 33 секунды (29.01.2012 - 21:04) Rand написал(а):
Можно создать в таблице пользователей поле isNewHash (булевого типа) со значением по умолчанию 0. При авторизации смотреть, если isNewHash = 0, то применяем старый алгоритм для сверки хеша, а после успешной авторизации берем и формируем новый хеш из только что присланного нам пароля + соль, после чего записываем новый хеш в базу и меняем значение в поле isNewHash на единицу. Если же при авторизации мы увидим, что isNewHash = 1, то просто применяем новый алгоритм сверки хешей и всё )) Так все активные пользователи сами поменяют свой хеш на новый, а неактивные пользователи сами виноваты )) Можно будет прислать на е-мейл всем зарегистрированным пользователям письмо, мол новая версия форума, новоя жизнь и т.д., чтобы мотивировать их снова зайти на форум =)

Спустя 14 минут, 26 секунд (29.01.2012 - 21:19) Lazy72 написал(а):
Цитата (Rand @ 29.01.2012 - 18:04)
Можно создать в таблице пользователей поле isNewHash (булевого типа) со значением по умолчанию 0. При авторизации смотреть, если isNewHash = 0, то применяем старый алгоритм для сверки хеша, а после успешной авторизации берем и формируем новый хеш из только что присланного нам пароля + соль, после чего записываем новый хеш в базу и меняем значение в поле isNewHash на единицу. Если же при авторизации мы увидим, что isNewHash = 1, то просто применяем новый алгоритм сверки хешей и всё )) Так все активные пользователи сами поменяют свой хеш на новый, а неактивные пользователи сами виноваты )) Можно будет прислать на е-мейл всем зарегистрированным пользователям письмо, мол новая версия форума, новоя жизнь и т.д., чтобы мотивировать их снова зайти на форум =)

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

Попробую описать порядок действий:

Берем пароли из мскл таблицы
Результат запроса переводим в массив
Изменяем значения данных массива
сохраняем массив
Копируем в другую таблицу новые значения

Спустя 11 минут, 50 секунд (29.01.2012 - 21:31) inpost написал(а):
Lazy72
Ну возьми в другой системе пару строк подправь... Программист ты или "администратор джумлы"?

Спустя 6 минут, 9 секунд (29.01.2012 - 21:37) Rand написал(а):
Lazy72, это невозможно, таков алгоритм md5.
Вот это:
$hash = md5('123');
$newHash = md5($hash . 'соль')

Тоже самое что
$newHash = md5('202cb962ac59075b964b07152d234b70соль');

Т.е. вычисляет md5 от совсем другого значения, чем в новом методе хеширования:
md5('123соль');

Узнать что было в старом md5 почти невозможно.
Даже если вычислить отдельно md5 из соли и сложить со старым md5 - всё равно, получится совсем другой md5 из строки 202cb962ac59075b964b07152d234b7001972c69b59b82d6cbb1eeaa955b7b64. Так, как вы хотите сделать - невыполнимая задача. Генерируйте сами новые пароли и рассылайте их пользователям по e-mail - по другому никак.

Спустя 31 минута, 48 секунд (29.01.2012 - 22:09) Lazy72 написал(а):
Цитата (Rand @ 29.01.2012 - 18:37)
Lazy72, это невозможно, таков алгоритм md5.
Вот это:
<pre class="sh_sourceCode" rel="php"><span class="sh_variable">$hash</span> <span class="sh_symbol">=</span> <span class="sh_function">md5</span><span class="sh_symbol">(</span><span class="sh_string">'123'</span><span class="sh_symbol">);</span>
<span class="sh_variable">$newHash</span> <span class="sh_symbol">=</span> <span class="sh_function">md5</span><span class="sh_symbol">(</span><span class="sh_variable">$hash</span> <span class="sh_symbol">.</span> <span class="sh_string">'соль'</span><span class="sh_symbol">)</span></pre>
Тоже самое что <pre class="sh_sourceCode" rel="php"><span class="sh_variable">$newHash</span> <span class="sh_symbol">=</span> <span class="sh_function">md5</span><span class="sh_symbol">(</span><span class="sh_string">'202cb962ac59075b964b07152d234b70соль'</span><span class="sh_symbol">);</span></pre>
Т.е. вычисляет md5 от совсем другого значения, чем в новом методе хеширования:<pre class="sh_sourceCode" rel="php"><span class="sh_function">md5</span><span class="sh_symbol">(</span><span class="sh_string">'123соль'</span><span class="sh_symbol">);</span></pre>
Узнать что было в старом md5 почти невозможно.
Даже если вычислить отдельно md5 из соли и сложить со старым md5 - всё равно, получится совсем другой md5 из строки 202cb962ac59075b964b07152d234b7001972c69b59b82d6cbb1eeaa955b7b64. Так, как вы хотите сделать - невыполнимая задача. Генерируйте сами новые пароли и рассылайте их пользователям по e-mail - по другому никак.

К счастью, возможно. Я пробовал вручную перехешировать пароли и перетащить на новую систему - всё получилось.

Можете проверить этим скриптом:
<?php 
$salt='test';
$pass = '1234';
$oldhash = md5($pass) ;
$newhash = md5(md5($pass).salt);
$testhash = md5($oldhash.salt);
echo ($newhash == $testhash) ? 'Yes!' : 'No(' ;
?>

Спустя 9 минут, 58 секунд (29.01.2012 - 22:19) Rand написал(а):
Так да, каюсь, будет работать, но я посчитал, что у вас новый алгоритм таков:
Цитата (Lazy72 @ 30.01.2012 - 01:09)
Таким образом пароли надо переместить, изменив их хеширование на md5($user_pass.salt)

А на самом деле md5(md5($user_pass).$salt), как вы написали выше.

Спустя 2 часа, 15 секунд (30.01.2012 - 00:19) Lazy72 написал(а):
Rand
Я так и понял)
Пытаюсь поменять записи массива подобным:
<?php 
$salt='test';
$mas = array(1,2,3);
foreach($mas as &$val){
md5($val . salt);
echo $val. '<br>';
}
?>

Но, конечно же, он не работает

Спустя 40 минут, 25 секунд (30.01.2012 - 00:59) Rand написал(а):
Цитата
md5($val . salt);

Перед salt забыли поставить знак '$' и результат работы функции md5 надо присваивать к $val:
$salt = 'test';
$mas = array(1,2,3);

foreach($mas as &$val){
$val = md5($val . $salt);
echo $val. '<br>';
}

Кстати, можно SQL запросом сделать:
UPDATE `table` SET `hash` = MD5(CONCAT(`hash`, 'testsalt'))


Спустя 15 часов, 28 минут, 58 секунд (30.01.2012 - 16:28) Lazy72 написал(а):
Rand
Большое спасибо! Работает!
А sql запрос просто чудесный)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.