node.js - 如何使用哈希在 Node.Js 应用程序中执行密码重置?
问题描述
我想在我的 Node.Js 应用程序中使用https://stackoverflow.com/a/27580553/712347的一个非常好的建议在我的 Node.Js 应用程序中实现密码重置,我不必将任何令牌记录到我的数据库中。
相反,@airtonix 建议使用基于用户登录名、电子邮件、密码、时间戳、秘密和盐的哈希函数。
我不明白的是哈希函数实际上是如何工作的——假设我从上面的数据中得到了一个特定的序列——使用什么算法(和库)来检查它是否是使用相同的数据生成的不同的盐?
还是我误解了整个事情?
解决方案
哈希函数通常如何实际工作 -
哈希算法创建数据的数字指纹,通常称为摘要或哈希。您主要看到用于比较目的而不是加密的哈希算法。
安全哈希算法具有一些基本特征,例如:
- 不可逆(单向功能)。您无法从摘要中确定原始数据集。
- 无论原始数据的大小如何,摘要都是固定大小。
- 独特。两个不同的数据集不能产生相同的摘要。
要使用的算法和库是什么?
我会推荐 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
}
}
使用相同的数据但不同的盐运行上述函数将导致完全不同的摘要。
推荐阅读
- javascript - 我无法将数据从 AngularJS 发送到 Spring MVC 控制器
- python - 训练损失高于验证损失
- matter.js - 如何在物质中改变身体的质地
- python - 如何访问具有多个字典的列表中的相似键、值对
- python - python 十六进制字符串到数组
- c# - C# WebClient 加密 - Charles
- ios - 如何在 iOS 中通过 musicxml 绘制乐谱?
- facebook-graph-api - Instagram 业务发现 API 分页令牌不起作用?
- java - 通过重新创建模式将领域迁移到特定版本的数据库
- hippocms - 如何在 hippo cms 中创建浏览器级别的图像缓存。还建议我如何在我的本地做到这一点