MD5 не выдает правильный хеш? - PullRequest
1 голос
/ 09 ноября 2011

UPDATE:

ОТВЕТ НАЙДЕН НА:

http://community.invisionpower.com/tracker/issue-21634-md5-once-password-does-not-decode-html-entities/


Я хочу создать отдельную страницу, используя свои учетные данные на форуме (я использую Invision Power Board) , поэтому я начал изучать, как работает пароль.

В основном на таблице членов у вас есть таблицы members_pass_hash и members_pass_salt, и шифрование выполняется следующим образом:

/**
 * Generates a compiled passhash.
 * Returns a new MD5 hash of the supplied salt and MD5 hash of the password
 *
 * @param   string      User's salt (5 random chars)
 * @param   string      User's MD5 hash of their password
 * @return  string      MD5 hash of compiled salted password
 */
static public function generateCompiledPasshash( $salt, $md5_once_password )
{
    return md5( md5( $salt ) . $md5_once_password );
}

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

Даже использование MD5(CONCAT(MD5(members_pass_salt),MD5('mypass')) direct в mysql не дает мне правильного значения ...

Я также искал в сообществах и на форуме ipb, но не могу сузить, в чем может быть проблема.

Мой код, который создает пароль, выглядит следующим образом:

$password = $this->input->post('password');
$md5_once_password = md5($password);
$password_hash = md5( md5( $salt ) . $md5_once_password );

$ salt получен из базы данных, и я отправил его на свою страницу, чтобы убедиться, что это тоже правильная соль.

Продолжая в коде IPB, также есть:

if ( $member['members_pass_hash'] == self::generateCompiledPasshash( $member['members_pass_salt'], $md5_once_password ) )
{
    return true;
}
else
{
    return false;
}

Возвращаясь к исходному коду, который я выложил из IPB, это означает, что пароль сопоставляется с полем members_pass_hash из таблицы участников с md5( md5( $salt ) . $md5_once_password )

Есть идеи, что я могу сделать неправильно, чтобы пароль не совпадал?

Кодировка где-нибудь или что-нибудь?

ОБНОВЛЕНИЕ с хэшами для тестирования:

Этот работает нормально:

salt: Do.|O
password: fsk23478cf
hash: f3f3c75110ea9a27a1c01e580676997f

Этот не работает, пока не знаю почему:

salt: ppxps
password: fsk23478cf!*
hash saved by the forum: d060c2fb78c5b8a9e9d303c7b4fab456
hash created by my aap: 0df0c7f24f7f79bd7ad8e501f5447986

UPDATE2:

Устранена проблема, связанная с exclamation mark паролем, но все еще не знаю, что его вызывает и как решить.

Пароли с ! не будут совпадать должным образом, и сейчас я пытаюсь выяснить, делает ли форум что-то особенное с !, которое я не нашел, все, что я обнаружил, это то, что он выполняет обрезку поле пароля, а затем md5, как указано выше.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2011

Вы должны знать, что если вы зададите любое значение от до md5(), оно выдаст всегда одинаковое значение .

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

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

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

0 голосов
/ 03 августа 2012

Длинное и короткое на этом:

При подготовке простого пароля IPB для простого хеширования md5, сначала запустите его через htmlentities ().

0 голосов
/ 09 ноября 2011

попытайтесь обрезать свой проход, bcs, когда у вас есть \ n или любой другой вид LF в конце, хеш будет вычислен из строки + lf. Я надеюсь, что это было полезно.

...