Node.js 》》bcryptjs 加密

bcryptjs

csharp 复制代码
# 安装
         npm install bcryptjs


# 基本用法 
  #1. 同步哈希和验证
	const bcrypt = require('bcryptjs');
	// 哈希密码
	const salt = bcrypt.genSaltSync(10); // 生成盐,10是成本因子
	const hashedPassword = bcrypt.hashSync('myPassword123', salt);
	
	console.log('Hashed Password:', hashedPassword);
	
	// 验证密码
	const isValid = bcrypt.compareSync('myPassword123', hashedPassword);
	console.log('Password valid:', isValid); // true
	
	const isInvalid = bcrypt.compareSync('wrongPassword', hashedPassword);
	console.log('Password valid:', isInvalid); // false
# 2. 异步哈希和验证(推荐)
    const bcrypt = require('bcryptjs');
	async function hashAndVerify() {
	  try {
	    // 哈希密码
	    const salt = await bcrypt.genSalt(10); // 生成盐
	    const hashedPassword = await bcrypt.hash('myPassword123', salt);
	    console.log('Hashed Password:', hashedPassword);
	
	    // 验证密码
	    const isValid = await bcrypt.compare('myPassword123', hashedPassword);
	    console.log('Password valid:', isValid); // true
	
	    const isInvalid = await bcrypt.compare('wrongPassword', hashedPassword);
	    console.log('Password valid:', isInvalid); // false
	  } catch (err) {
	    console.error('Error:', err);
	  }
	}	
	hashAndVerify();

在实际应用中的使用示例

javascript 复制代码
const express = require('express');
const bcrypt = require('bcryptjs');
const app = express();

app.use(express.json());

// 模拟数据库
const users = [];

// 注册路由
app.post('/register', async (req, res) => {
  try {
    const { username, password } = req.body;
    
    // 检查用户是否已存在
    const userExists = users.some(user => user.username === username);
    if (userExists) {
      return res.status(400).json({ message: '用户名已存在' });
    }
    
    // 哈希密码
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(password, salt);
    
    // 存储用户
    const newUser = {
      id: Date.now().toString(),
      username,
      password: hashedPassword
    };
    users.push(newUser);
    
    res.status(201).json({ message: '用户注册成功', userId: newUser.id });
  } catch (err) {
    res.status(500).json({ message: '注册失败', error: err.message });
  }
});

// 登录路由
app.post('/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    
    // 查找用户
    const user = users.find(user => user.username === username);
    if (!user) {
      return res.status(401).json({ message: '用户名或密码错误' });
    }
    
    // 验证密码
    const isValidPassword = await bcrypt.compare(password, user.password);
    if (!isValidPassword) {
      return res.status(401).json({ message: '用户名或密码错误' });
    }
    
    res.json({ message: '登录成功', userId: user.id });
  } catch (err) {
    res.status(500).json({ message: '登录失败', error: err.message });
  }
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});
相关推荐
柳杉2 小时前
从零打造 AI 全球趋势监测大屏
前端·javascript·aigc
simple_lau2 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js
睡不着先生2 小时前
如何设计一个真正可扩展的表单生成器?
前端·javascript·vue.js
进击的尘埃2 小时前
AI 代码审查工具链搭建:用 AST 解析 + LLM 实现自动化 Code Review 的前端工程方案
javascript
juejin_cn2 小时前
[转][译] 从零开始构建 OpenClaw — 第五部分(对话压缩)
javascript
willow4 小时前
Promise由浅入深
javascript·promise
董员外4 小时前
LangChain.js 快速上手指南:Tool的使用,给大模型安上了双手
前端·javascript·后端
willow4 小时前
Generator与Iterator
javascript
wuhen_n5 小时前
Pinia状态管理原理:从响应式核心到源码实现
前端·javascript·vue.js
晴殇i5 小时前
CommonJS 与 ES6 模块引入的区别详解
前端·javascript·面试