如何使用哈希在 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
}
}
运行 上述函数具有相同的数据但不同的盐会导致完全不同的摘要。
我想在我的 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
}
}
运行 上述函数具有相同的数据但不同的盐会导致完全不同的摘要。