Реализация 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 2

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 api

const 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.