Реализация NodeJS для Python's pbkdf2 sha256.проверить
Я должен перевести этот код Python в NodeJS:
from passlib.hash import pbkdf2_sha256
pbkdf2_sha256.verify('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
>> True
Приведенный выше код является полным кодом, т. е. нет никаких других параметров/настроек (просто запустите pip install passlib
перед запуском, чтобы установить пакет passlib
).
Я ищу правильную реализацию функции validatePassword
в узле, который пройдет этот положительный тест реализации:
validatePassword('12345678', '$pbkdf2-sha256$2000$8R7jHOOcs7YWImRM6V1LqQ$CIdNv8YlLlCZfeFJihZs7eQxBsauvVfV05v07Ca2Yzg')
>> true
Здесь находится документация passlib.хэш.pbkdf2_sha256 со значениями параметров по умолчанию.
Я пытался ... следуйте ответам из здесь с данными из кода Python выше, но эти решения не прошли тест.
Я был бы признателен за некоторую помощь с этой реализацией (предпочтительно с использованием встроенного пакета NodeJS crypto
).
Заранее благодарю вас.
2 ответа:
Это будет работать:
const crypto = require('crypto') function validatePassword(secret, format) { let parts = format.split('$') return parts[4] == crypto.pbkdf2Sync(secret, Buffer.from(parts[3].replace(/\./g, '+') + '='.repeat(parts[3].length % 3), 'base64'), +parts[2], 32, parts[1].split('-')[1]).toString('base64').replace(/=/g, '').replace(/\+/g, '.') }
Можно использовать собственный узел
crypto.pbkdf2
.JS apiconst crypto = require('crypto'); crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha256', (err, derivedKey) => { if (err) throw err; console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' });
Он имеет следующий api:
password <string>
salt <string>
iterations <number>
keylen <number>
digest <string>
callback <Function>
err <Error>
derivedKey <Buffer>
Таким образом, вам нужно будет играть с входными переменными, чтобы получить ожидаемый результат, как в python.
Альтернативный подход
Я играл с входными переменными, с небольшим успехом, и самая простая идея, которую я получил, состоит в том, чтобы сделать скрипты python, которые проверяют пароли и вызывают его с
child_process.spawn
в узле.JS.