Bcrypt 用于 JavaScript (Node.js):完整指南
\n\n1. 什么是 Bcrypt 以及为什么需要它
\n\nBcrypt 是一种自适应密码哈希函数,专门为安全存储密码而设计。与普通哈希函数(MD5、SHA-1、SHA-256)不同,这些函数旨在快速计算,而 Bcrypt 故意设计得缓慢且资源密集。这使得暴力破解和彩虹表攻击几乎不可行。用于 Node.js 的 bcrypt 库为密码哈希和验证提供了简单可靠的接口。
为什么要使用 Bcrypt?当用户在网站上注册时,其密码绝不应以明文形式存储。如果数据库被入侵,攻击者将获得所有密码的访问权限。Bcrypt 解决了这个问题:您使用唯一的“盐”(salt)对密码进行哈希处理,并仅存储哈希值。当用户登录时,您再次对输入的密码进行哈希处理,并与存储的哈希值进行比较。Bcrypt 会自动生成盐并将其嵌入到结果中,因此您无需单独存储它。
\n\nBcrypt 的关键特性是能够调整“成本因子”(cost factor)。成本值越高,计算哈希所需的时间就越长。随着计算能力的增长,您可以简单地增加成本因子,而旧的哈希值仍然有效(验证时使用哈希中存储的成本因子)。这使得 Bcrypt 能够抵御未来硬件加速方面的进步。
\n\n2. 安装
\n\n要在 Node.js 项目中安装 Bcrypt 库,请在终端(项目根文件夹)中执行以下命令:
\n\nnpm install bcrypt\n\n安装后,您可以将库导入到代码中:
\n\nconst bcrypt = require('bcrypt');\n\n如果您使用 ES 模块(package.json 中的 type: "module"),导入方式如下:
\n\nimport bcrypt from 'bcrypt';\n\n3. 快速入门 — 最小工作示例
\n\n在此示例中,我们对密码进行哈希处理,然后进行验证。这是任何身份验证系统的基础。
\n\nconst 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)。
4. 主要方法/函数/类
\n\n4.1. bcrypt.hash(data, saltOrRounds, callback)
\n签名: bcrypt.hash(data: string | Buffer, saltOrRounds: number | string, callback: (err: Error | null, encrypted: string) => void): void
功能: 异步哈希字符串或 Buffer。saltOrRounds 可以是数字(轮数)或现成的盐(字符串)。通过回调返回哈希值。
示例:
\nbcrypt.hash('password123', 12, (err, hash) => {\n if (err) throw err;\n console.log(hash); // $2b$12$...\n});\n\n4.2. bcrypt.hashSync(data, saltOrRounds)
\n签名: bcrypt.hashSync(data: string | Buffer, saltOrRounds: number | string): string