Как выполнить сброс пароля в приложении Node.Js, используя хэш? - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу реализовать сброс пароля в моем приложении Node.Js, используя очень полезный совет: https://stackoverflow.com/a/27580553/712347, где мне не нужно было бы записывать токены в мою базу данных.

Вместо @airtonixпредложил использовать хеш-функцию, основанную на имени пользователя, электронной почте, пароле, отметке времени, секрете и соли.

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

Или я неправильно понимаю все это?

1 Ответ

0 голосов
/ 01 декабря 2018

Как обычно работают хеш-функции -

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

Алгоритмы безопасного хеширования имеют некоторые фундаментальные характеристики, такие как:

  • Необратимый ( односторонняя функция ).Вы не можете определить исходный набор данных из Дайджеста.
  • Дайджест будет иметь фиксированный размер независимо от размера исходных данных.
  • Уникальный.Два разных набора данных не могут создать один и тот же дайджест.

Какой алгоритм и какую библиотеку использовать?

Я бы порекомендовал SHA-2 (SHA-256 или SHA-512) в качестве алгоритма хеширования и используют криптографический модуль .Он предоставляет криптографическую функциональность и набор оболочек для хеш-функций, HMAC, шифрования, дешифрования, подписи и проверки функций OpenSSL.

Итак, допустим, у нас есть следующая информация ( user.id, user.email, user.password, timestamp ), объединить его и передать в качестве параметра данных.

const hash = function hash(data){

   // Returns a buffer containing raw bytes and converts to string
   const salt = crypto.randomBytes(128).toString('base64')

   // Creates and returns a Hmac object that uses the given algorithm
   const hmac = crypto.createHmac('sha512', salt)

   // Updates the Hmac object content with the given data
   hmac.update(data)

   // Calculates the digest of all of the data passed to be hashed
   const digest = hmac.digest('hex')

   return {
     'salt'  : salt,
     'digest': digest
   } 

}

Запуск вышеуказанной функции с теми же данными, но другой солью приведет к совершенно другому дайджесту.

...