Мне нужно иметь возможность проверить в 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?