使用内置“crypto”在nodejs中进行密码散列

2023-11-25

仅使用内置函数在 Node.js 中实现密码哈希和验证的最佳方法是什么crypto模块。 基本上需要什么:

function passwordHash(password) {} // => passwordHash
function passwordVerify(password, passwordHash) {} // => boolean

人们通常都在使用bcrypt或用于此目的的其他第三方库。我想知道不是内置的crypto模块足够大,至少可以满足所有基本需求吗?

There's scrypt(),这似乎是实现此目的的正确人选,但没有经过验证的对应对象,并且似乎没人关心.


import { scrypt, randomBytes, timingSafeEqual } from "crypto";
import { promisify } from "util";

// scrypt is callback based so with promisify we can await it
const scryptAsync = promisify(scrypt);

哈希过程有两种方法。第一种方法,您对密码进行哈希处理,第二种方法,您需要将新的登录密码与存储的密码进行比较。我用打字稿详细写下一切

export class Password {

  static async hashPassword(password: string) {
    const salt = randomBytes(16).toString("hex");
    const buf = (await scryptAsync(password, salt, 64)) as Buffer;
    return `${buf.toString("hex")}.${salt}`;
  }

  static async comparePassword(
    storedPassword: string,
    suppliedPassword: string
  ): Promise<boolean> {
    // split() returns array
    const [hashedPassword, salt] = storedPassword.split(".");
    // we need to pass buffer values to timingSafeEqual
    const hashedPasswordBuf = Buffer.from(hashedPassword, "hex");
    // we hash the new sign-in password
    const suppliedPasswordBuf = (await scryptAsync(suppliedPassword, salt, 64)) as Buffer;
    // compare the new supplied password with the stored hashed password
    return timingSafeEqual(hashedPasswordBuf, suppliedPasswordBuf);
  }
}

Test it:

Password.hashPassword("123dafdas")
  .then((res) => Password.comparePassword(res, "123edafdas"))
  .then((res) => console.log(res));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内置“crypto”在nodejs中进行密码散列 的相关文章

  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • editMessageReplyMarkup 方法删除内联键盘

    我正在使用 node js 制作一个电报机器人node telegram bot api图书馆 我回答callback query并想更换我的内联键盘 下面的代码显示了我如何尝试使用此方法 但是当我在电报中点击键盘时 它就消失了 bot o
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • 将异步事件监听器与 Nestjs EventEmitter 模块和无服务器函数结合使用

    我正在尝试在 Nestjs EventEmitter 模块的帮助下实现具有无服务器 lambda 函数的异步工作线程 处理程序在发出事件时被调用 但该函数在 async await 调用之前关闭 我尝试过同时使用emit and emitA
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 使 Material UI Grid 项目的子项拉伸以适合父容器的剩余高度

    1 现状 我有一个包含 4 个网格项的 Material UI 网格容器 每个 Grid 项中都有一个 Typography 组件 其中包含标题和包含一些内容的 Card 如下所示 2 期望的外观 我希望卡片填充网格项目的剩余高度并且不超过
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • Aurelia - 仅 HTML 自定义元素的内联定义

    我的 Aurelia 视图模型中有一个递归对象 如下所示 Class BottomlessPit Name string MorePits BottomlessPit null 因此 我想在 Aurelia 视图中使用递归模板 它只会在一个
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • 下载中带有文件名的 NodeJS sendFile

    我尝试使用以下代码将文件发送给客户端 router get get myfile function req res next res sendFile other file name dat 它工作正常 但当用户从以下网址下载此文件时我需要
  • 如何为 Imagus 悬停缩放扩展开发自定义过滤器?

    当我读到关于悬停缩放是邪恶的 http www reddit com r YouShouldKnow comments 1wjrc8 ysk that the hover zoom extension is spyware 哎呀 有两篇文章
  • Nodejs Express中间件函数返回值

    我正在使用 NodeJS 和 Express 我有以下路线 中间件功能是Mobile 如果我不使用 return next 在 isMobile 函数中 应用程序会卡住 因为 NodeJS 不会移至下一个函数 但我需要 isMobile 函
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我

随机推荐

  • 如何在 Android 中以编程方式读取 SHA 和 MD5 指纹

    您好 我想以编程方式读取我的应用程序的签名密钥库的 SHA 和 MD5 指纹值 我将采用 SHA 或 MD5 值作为安全密钥 我将在代码中使用该密钥来加密某些内容并在服务器端解密相同的内容 有什么方法可以找到这个 或者有什么方法可以使用不同
  • 表单验证 - 我收到标签两次

    我有一个注册表单 来自 FOSUserBundle 它位于模板中 form theme form AcmeMyBundle Form errors html twig
  • 无法在脚本中导入导入日期时间[重复]

    这个问题在这里已经有答案了 我无法从 python 脚本导入日期时间 但可以从终端命令行导入 1 import datetime 2 From datetime import datetime month datetime datetime
  • java8数组流到二维数组

    我是 Java8 的新手 无法使用流将一个数组映射到另一个二维数组 我有一个二维数组 它是一种模式 boolean pattern true true false true false true false true true 第二个数组包
  • 未知类型名称 __m256 - AVX 的英特尔内在函数无法识别?

    我正在尝试测试一些英特尔内部函数 看看它们是如何工作的 因此 我创建了一个函数来为我执行此操作 这是代码 void test intel 256 m256 res vec1 vec2 M256 MM SET PS vec1 7 0 7 0
  • Python tkinter 禁用按钮直到所有字段都被填充

    假设我在 tkinter 中有 2 个条目小部件 1 个选项菜单 下拉列表 和 1 个按钮 在用户填充所有 3 个小部件之前 如何将按钮小部件状态设置为 禁用 这就是我当前所拥有的 import Tkinter as tk root tk
  • 颤振删除应用栏上的后退按钮

    我想知道是否有人知道如何删除显示在屏幕上的后退按钮appBar当您使用 flutter 应用程序时Navigator pushNamed转到另一个页面 我不希望它出现在这个结果页面上的原因是它来自导航 我希望用户使用logout按钮 以便会
  • Spring Data Mongodb批量操作示例

    有人可以给我指点 Spring Data Mongodb DB 批量操作示例的完整示例吗 我正在尝试使用 spring data mongodb 切换到批量更新 无法找到一个好的例子 谢谢 Spring data mongodb 中的 Bu
  • Javascript - 跟踪鼠标位置

    我希望每 t 毫秒定期跟踪鼠标光标的位置 所以本质上 当页面加载时 这个跟踪器应该启动并且 比如说 每 100 毫秒 我应该获取 posX 和 posY 的新值并将其打印在表单中 我尝试了以下代码 但值没有刷新 只有 posX 和 posY
  • 了解 Xcode 中的 Instruments,测试泄漏

    我刚刚开始使用 Instruments 这是一个很好的小工具 用于测试内存分配 泄漏以及所有这些很棒的东西 但我对它的工作原理感到非常困惑 我寻找过解释如何使用它的教程 但没有教程解释如何使用它 我将尝试解释这一点 我将其设置为每当我运行
  • 无法从本地计算机连接到 Google 计算引擎上的 kafka 服务器

    我正在谷歌计算引擎上运行我的动物园管理员和卡夫卡服务器 两者都在默认端口上运行 zookeeper 在 2181 上 kafka 在 9092 上 两者都在同一个实例上运行 我也打开了这两个端口 在我的 server properties
  • 在 Maven 中配置 hibernate-jpamodelgen

    我要配置hibernate jpamodelgen进入Mavenpom xml 我试过这个
  • C++ 声明中的“&”有什么作用?

    我是一个 C 人员 我正在尝试理解一些 C 代码 我有以下函数声明 int foo const string myname cout lt lt called foo for lt lt myname lt lt endl return 0
  • Rails 4 Devise 3.1.1 Devise::RegistrationsController#new 中的 ActionController::UnknownFormat

    我正在开发一个 Rails 4 应用程序 使用 Devise 3 1 1 进行用户身份验证 当我单击 users sign up user 链接时 Rails 抛出以下异常 ActionController UnknownFormat in
  • 将发送的短信写入 content://sms/sent 表

    我正在开发一个 android 短信应用程序 我可以使用以下代码向单个联系人发送短信 sms sendTextMessage phoneNumber null message sentPI deliveredPI 现在我想向多重联系人发送短
  • Kibana 直方图 - 在单个图表上绘制多个系列

    我在 Elasticsearch 中有一个索引 其中包含一个简单对象数组 键值请参见下面的示例 这些文档有时间戳 我可以在 Kibana 中为每个键值创建单独的直方图 即一个图表用于 bytes sent 另一个图表用于 bytes rec
  • Angular 2 的 JSPM 与 WebPack

    最近我在我的 Angular 2 项目中使用了 JSPM 发现它使用起来非常简单和方便 无论是添加新模块还是创建用于生产的捆绑包 基本上就是 jspm install npm angular somepackage package json
  • 在 Web 应用程序中显示 PDF

    我已经用谷歌搜索了这个 搜索了这个 浏览了SO和其他网站 我已经尝试阅读这个问题几个小时了 但我似乎仍然找不到一个令人满意的解决方案来解决这个看似简单的问题 常见的编程问题 让我来设定一下场景 我有一个网站 Web 应用程序 允许用户搜索
  • python opencv imwrite ...找不到参数

    我正在使用 opencv 和 python 我想做一个 cv2 imwrite cv2 imwrite myimage png my im 唯一的问题是 opencv 无法识别 params 常量 cv2 imwrite myimage p
  • 使用内置“crypto”在nodejs中进行密码散列

    仅使用内置函数在 Node js 中实现密码哈希和验证的最佳方法是什么crypto模块 基本上需要什么 function passwordHash password gt passwordHash function passwordVeri