如何使用哈希在 Node.Js 应用程序中执行密码重置?

How to perform password reset in Node.Js app using hash?

我想在我的 Node.Js 应用程序中实施密码重置,使用此处 的非常好的建议,这样我就不必将任何令牌记录到我的数据库中。

相反,@airtonix 建议使用基于用户登录名、电子邮件、密码、时间戳、秘密和盐的哈希函数。

我不明白的是哈希函数实际上是如何工作的——假设我从上面的数据中得到了一个特定的序列——用来检查它是否是从中生成的算法(和库)是什么使用不同盐的相同数据?

还是我误解了整件事?

哈希函数通常是如何工作的-

哈希算法创建数据的数字指纹,通常称为摘要或哈希。您主要看到哈希算法用于比较目的而不是加密。

安全哈希算法具有一些基本特征,例如:

  • 不可逆(单向函数)。您无法从摘要中确定原始数据集。
  • 无论原始数据的大小如何,摘要都将是固定大小。
  • 独一无二。两个不同的数据集不能产生相同的摘要。

使用什么算法和库?

我会推荐 SHA-2(SHA-256 或 SHA-512)作为散列算法并使用 Crypto module。它为 OpenSSL 的散列、HMAC、密码、解密、签名和验证功能提供加密功能和一组包装器。

假设我们有以下信息(user.id、user.email、user.password、时间戳),将其连接并传递作为数据参数。

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
   } 

}

运行 上述函数具有相同的数据但不同的盐会导致完全不同的摘要。