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}`);
});
相关推荐
子兮曰6 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
百锦再6 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
颜酱8 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
小迷糊的学习记录9 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜9 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言