Bcrypt 用于 JavaScript (Node.js):完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Bcrypt 用于 JavaScript (Node.js):完整指南

\n\n

1. 什么是 Bcrypt 以及为什么需要它

\n\n

Bcrypt 是一种自适应密码哈希函数,专门为安全存储密码而设计。与普通哈希函数(MD5、SHA-1、SHA-256)不同,这些函数旨在快速计算,而 Bcrypt 故意设计得缓慢且资源密集。这使得暴力破解和彩虹表攻击几乎不可行。用于 Node.js 的 bcrypt 库为密码哈希和验证提供了简单可靠的接口。

\n\n

为什么要使用 Bcrypt?当用户在网站上注册时,其密码绝不应以明文形式存储。如果数据库被入侵,攻击者将获得所有密码的访问权限。Bcrypt 解决了这个问题:您使用唯一的“盐”(salt)对密码进行哈希处理,并仅存储哈希值。当用户登录时,您再次对输入的密码进行哈希处理,并与存储的哈希值进行比较。Bcrypt 会自动生成盐并将其嵌入到结果中,因此您无需单独存储它。

\n\n

Bcrypt 的关键特性是能够调整“成本因子”(cost factor)。成本值越高,计算哈希所需的时间就越长。随着计算能力的增长,您可以简单地增加成本因子,而旧的哈希值仍然有效(验证时使用哈希中存储的成本因子)。这使得 Bcrypt 能够抵御未来硬件加速方面的进步。

\n\n

2. 安装

\n\n

要在 Node.js 项目中安装 Bcrypt 库,请在终端(项目根文件夹)中执行以下命令:

\n\n
npm install bcrypt
\n\n

安装后,您可以将库导入到代码中:

\n\n
const bcrypt = require('bcrypt');
\n\n

如果您使用 ES 模块(package.json 中的 type: "module"),导入方式如下:

\n\n
import bcrypt from 'bcrypt';
\n\n

3. 快速入门 — 最小工作示例

\n\n

在此示例中,我们对密码进行哈希处理,然后进行验证。这是任何身份验证系统的基础。

\n\n
const bcrypt = require('bcrypt');\n\nconst plainPassword = 'mySuperSecretPassword123!';\nconst saltRounds = 10;\n\n// 哈希密码\nbcrypt.hash(plainPassword, saltRounds, function(err, hash) {\n    if (err) {\n        console.error('哈希错误:', err);\n        return;\n    }\n    console.log('密码哈希值:', hash);\n\n    // 验证密码\n    bcrypt.compare(plainPassword, hash, function(err, result) {\n        if (err) {\n            console.error('比较错误:', err);\n            return;\n        }\n        console.log('密码匹配:', result); // true\n    });\n});
\n\n

这段代码做了两件事:创建密码的哈希值,然后验证原始密码是否与此哈希值匹配。请注意,saltRounds 决定了计算的复杂度(建议值为 10–12)。

\n\n

4. 主要方法/函数/类

\n\n

4.1. bcrypt.hash(data, saltOrRounds, callback)

\n

签名: bcrypt.hash(data: string | Buffer, saltOrRounds: number | string, callback: (err: Error | null, encrypted: string) => void): void

\n

功能: 异步哈希字符串或 Buffer。saltOrRounds 可以是数字(轮数)或现成的盐(字符串)。通过回调返回哈希值。

\n

示例:

\n
bcrypt.hash('password123', 12, (err, hash) => {\n    if (err) throw err;\n    console.log(hash); // $2b$12$...\n});
\n\n

4.2. bcrypt.hashSync(data, saltOrRounds)

\n

签名: bcrypt.hashSync(data: string | Buffer, saltOrRounds: number | string): string

推荐