Как проверить пароли Symfony2 sha512 с помощью nodejs

Мне нужно иметь возможность проверить в node некоторый пароль, который был сгенерирован и сохранен с использованием Symfony2 с кодировкой sha512.

Я могу получить hash и salt просто отлично, но при использовании crypto мне не удается сгенерировать хеш, используя соль, которая соответствует той, которая хранится в базе данных.

Безопасность Symfony.yml

security:
    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512

Хэш хранится в БД

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==

Соль хранится в БД

qu7rjvaietws8kg4cgsggksookwsws8

Поскольку на стороне узла есть соль, я использую crypto.pbkdf2Sync, в конфигурации нет итераций, и кажется, что значение по умолчанию Symfony равно 1000. Однако длина по умолчанию составляет 40, а сохраненная длина хэша составляет 128, поэтому использование 128 как длина (пробовал 40 без успеха).

Я также пробовал 5000 итераций, используемых Symfony 2 MessageDigestPasswordEncoder, и слияние необработанного пароля с солью, как это делает Symfony raw_password{salt}, но безуспешно.

Я также могу получить base64 достаточно долго, если я использую pbkdf2Sync для генерации ключа длиной 40 (согласно symfony по умолчанию), а затем использую это для обновления хеша, сгенерированного с помощью crypto.createHash

var hash = user.password;
var salt = user.salt;

console.log(hash);

console.log(crypto.pbkdf2Sync("password", salt, 1000, 128 >> 1, "sha512").toString("base64"));

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

Выход

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ==
w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA==

Как я могу сгенерировать хэш, чтобы он соответствовал способу, используемому Symfony 2?


person GillesC    schedule 03.10.2014    source источник


Ответы (3)


Symfony выполняет 5000 итераций с sha512.

  1. Они объединяют необработанный пароль с солью пользователя для создания новой соли.
  2. Они генерируют начальный хеш с указанными выше данными.
  3. На каждой итерации предыдущий хэш обновляется текущим хэшем + новым salt, сгенерированным на шаге 1.

В узле на каждой итерации вы должны обрабатывать предыдущий хеш как двоичный файл и, в конце концов, как base64, чтобы имитировать то, что делает Symfony.

И пример:

var crypto = require('crypto');

var encodePassword = function (raw, salt) {
    var salted = raw + '{'+salt+'}',
        hash = crypto.createHash('sha512').update(salted, 'utf-8');

    for (var i = 1; i < 5000 ; i++) {
        hash = crypto.createHash('sha512').update(hash.digest('binary')+salted);
    }

    return hash.digest('base64');
};

console.log("Password: "+ encodePassword("secret", "h2zaays1cx2og00c6ow2gc0k4skg41g"));
person Alexandru Guzinschi    schedule 04.10.2014

Здравствуйте, может кому пригодится. Это часть кода с моего сайта, который работает.

https://gist.github.com/konstantinzolotarev/deec71876739f8bf1058

person Konstantin Zolotarev    schedule 08.10.2014

Проверьте источник Pbkdf2PasswordEncoder. код для просмотра значений по умолчанию. Также имейте в виду, что Symfony будет использовать base64_encode по умолчанию.

person Alexey B.    schedule 03.10.2014
comment
Спасибо, похоже, что по умолчанию действительно 1000 и уже используется кодировка base64, так что уже пытались и потерпели неудачу. Одна странная вещь заключается в том, что длина по умолчанию равна 40, а сохраненный хэш - 128. Я пробовал 40, но длина хеша не соответствовала длине БД, поэтому я использую 128. - person GillesC; 03.10.2014
comment
Почти уверен, что sha512 сопоставляется с MessageDigestPasswordEncoder, а не с Pbkdf2PasswordEncoder, который. Я могу ошибаться. symfony.com/doc/current/reference/configuration/security.html - person Cerad; 03.10.2014