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}`);
});
相关推荐
方也_arkling18 小时前
【Java-Day08】static / final / 枚举
java·开发语言
风吹夏回19 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei1119 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_11219 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding19 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋919 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
xiaoshuaishuai819 小时前
C# 内存管理与资源泄漏
开发语言·c#
lsx20240620 小时前
SVN 检出操作
开发语言
不总是20 小时前
Windows 系统 Node.js 免安装版(zip)安装与配置教程(2026 最新)
前端·windows·node.js
basketball61620 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++