首页 > 解决方案 > 如何使用哈希在 Node.Js 应用程序中执行密码重置?

问题描述

我想在我的 Node.Js 应用程序中使用https://stackoverflow.com/a/27580553/712347的一个非常好的建议在我的 Node.Js 应用程序中实现密码重置,我不必将任何令牌记录到我的数据库中。

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

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

还是我误解了整个事情?

标签: node.jshashchange-password

解决方案


哈希函数通常如何实际工作 -

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

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

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

要使用的算法和库是什么?

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

假设我们有以下信息(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
   } 

}

使用相同的数据但不同的盐运行上述函数将导致完全不同的摘要。


推荐阅读