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}`);
});
相关推荐
Bdygsl10 分钟前
Node.js(3)—— fs模块
node.js
Morpheon1 小时前
Intro to R Programming - Lesson 4 (Graphs)
开发语言·r语言
代码AI弗森1 小时前
使用 JavaScript 构建 RAG(检索增强生成)库:原理与实现
开发语言·javascript·ecmascript
Lhy@@1 小时前
Axios 整理常用形式及涉及的参数
javascript
Tipriest_2 小时前
C++ 中 ::(作用域解析运算符)的用途
开发语言·c++·作用域解析
Swift社区2 小时前
Java 常见异常系列:ClassNotFoundException 类找不到
java·开发语言
Tipriest_3 小时前
求一个整数x的平方根到指定精度[C++][Python]
开发语言·c++·python
@大迁世界3 小时前
告别 React 中丑陋的导入路径,借助 Vite 的魔法
前端·javascript·react.js·前端框架·ecmascript
EndingCoder3 小时前
Electron Fiddle:快速实验与原型开发
前端·javascript·electron·前端框架
EndingCoder3 小时前
Electron 进程模型:主进程与渲染进程详解
前端·javascript·electron·前端框架