Реализация Phpass в WP и Node не совпадает, если в пароле есть международные символы - PullRequest
0 голосов
/ 21 июня 2019

Я хочу аутентифицировать пользователей WP, используя мой собственный сервис аутентификации, написанный на Node.У меня есть пользователи, сохраненные в таблице wp_users.Их пароли хешируются с помощью метода Phpass от WordPress.Когда пользователь пытается войти в свою учетную запись, WP использует метод CheckPassword() и возвращает логическое значение true / false, если пароль совпадает или нет.

Теперь я хочу использовать Node для сравнения пользователей.пароль к хешу WP.Я нашел модуль node-phpass в NPM, который должен обеспечивать алгоритм Phpass для хэширования пароля.

Все хорошо, пока я не использую международные символы.Вот пример:

В WP я устанавливаю пароль следующим образом и получаю хеш:

P: alamakota
H: $P$BSrncAWIY2KU7waUGLzayaon6v3gKU1

Когда я пытаюсь войти в систему, WP говорит «Все хорошо, заходите, чувак»

Теперь я беру хэш и пытаюсь проверить его с помощью модуля node-phpass:

const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword('alamakota', '$P$BSrncAWIY2KU7waUGLzayaon6v3gKU1');
console.log(valid); // => true

и там написано «Круто, пароль совпадает!»

Работает отлично и в другом направлении.

Теперь, где жепроблема возникает, спросите вы?Здесь:

Ситуация почти точно такая же, как и раньше, но я введу символ ą в пароль и хеширую его, используя WP:

P: alamakotą
H: $P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1

Опять же, при проверке с использованием WP появляется «Пароль совпадает. Входите.»

К сожалению,когда я пытаюсь сравнить пароль с помощью node-phpass, он говорит «Извините, чувак, вы не пройдете» :

const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword('alamakotą', '$P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1');
console.log(valid); // => false

Он также не работает по-другому.

Почему это так?Почему я не могу использовать хеш WP в Node.js, когда в пароле есть международные символы?

ОБНОВЛЕНИЕ:

Я только что обнаружил, что PHP md5() function and JS'es crypto.createHash('md5') не возвращает тот же хэш, когда во входной строке есть международные символы.Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 21 июня 2019

Итак, оказалось, что PHP-функция md5() возвращает хэш, отличный от JS'es crypto.createHash('md5') из-за кодировки символов. Я использовал utf8 перед сравнением пароля с хешем, и все работает как положено:

const utf8 = require('utf8');
const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword(utf8.encode('alamakotą'), '$P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1');
console.log(valid); // => true
...