Express的使用笔记9 使用bcrypt算法给用户密码加密

news/2024/12/16 16:58:17/文章来源:https://www.cnblogs.com/jocelyn11/p/18610551

先了解一下bcrypt算法,一种基于Blowfish密码学算法的密码散列函数,用于在密码存储时抵抗暴力破解攻击,通过在散列过程中加salt来提高安全性,salt是个随机生成的数据串,与密码一起被散列,使得即使两个相同的密码也会产生不同的散列值。bcrypt算法允许开发者指定工作因子(成本因子),决定散列计算的复杂度,随之硬件性能的提升,可以适当增加工作因子以保持密码的安全性。

bcrypt 算法的以下特点使其成为 Web 应用密码存储的理想选择:
加盐散列:每个密码都会有一个唯一的盐,这大大增加了破解的难度。
工作因子:可以根据需要调整散列的复杂度。
慢速散列:bcrypt 故意设计为计算密集型,以减缓暴力破解尝试。
自适应性:随着计算能力的提高,可以增加工作因子来保持密码散列的安全性。

下面开始在express中加入bcrypt。
1)npm install bcrypt
2) 在对应的文件中添加逻辑

model/user.js 中加入加密后存储的配置逻辑

const mongoose = require("mongoose");
const baseModel = require("./base-model");
const bcrypt = require("bcrypt"); //引入bcrypt 哈希处理后存储密码
const userSchema = new mongoose.Schema({...baseModel,username: {type: String,required: true,},password: {type: String,required: true,set(val) {if (!val) return val; // 如果没有提供密码,则直接返回,不做处理const hashedPassword = bcrypt.hashSync(val, 10); // 对密码进行哈希处理return hashedPassword; // 返回哈希后的密码}},email: {type: String,required: true,},bio: {type: String,defualt: null,},image: {type: String,defualt: null,},
});module.exports = userSchema;

在router/user.js的登录api中加入解密逻辑

const express = require("express");
const router = express.Router();
router.use(express.json());
const { body, validationResult } = require("express-validator");
const userCtrl = require("../controller/user");
const { User } = require("../model");
const bcrypt = require("bcrypt"); //引入bcrypt 哈希处理后存储密码
// 用户登录
router.post("/users/login", userCtrl.login);
// 用户注册
router.post("/users",[body("user.username").notEmpty().withMessage("用户名不能为空").bail().custom(async (username) => {const name = await User.findOne({ username });if (name) {return Promise.reject("用户名已存在");}}),body("user.email").notEmpty().withMessage("邮箱不能为空").isEmail().withMessage("邮箱的格式不准确").bail().custom(async (email) => {const user = await User.findOne({ email });if (user) {return Promise.reject("邮箱已存在");}}),],(req, res, next) => {const errors = validationResult(req);if (!errors.isEmpty()) {return res.status(400).json({ errors: errors.array()[0] });}next();},userCtrl.register
);
// 获取当前登录用户
router.get("/user",[body("user.username").notEmpty().withMessage("用户名不能为空"),body("user.password").notEmpty().withMessage("密码不能为空").bail().custom(async (password,{req}) => {const user = await User.findOne({ username: req.body.user.username });if (!user) {return Promise.reject("账户或密码错误,请检查!");}// 比较提供的密码与数据库中存储的哈希密码const isMatch = await bcrypt.compare(password, user.password);if (!isMatch) {return Promise.reject("账户或密码错误,请检查!");}return true;}),],(req, res, next) => {const errors = validationResult(req);if (!errors.isEmpty()) {return res.status(400).json({ errors: errors.array()[0] });}next();},userCtrl.getCurUser
);
// 更新当前登录用户
router.put("/user", userCtrl.updateCurUser);module.exports = router;

这样在用户注册的时候,就可以加密后存储到数据库啦

用户登录的时候正常输入账号密码,进入解码逻辑,正常登录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.mysql中的存储过程

创建存储过程和函数 CREATE[DEFINER = {USER | CURRENT_USER}] # 定义者是谁PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_bodyCREATE [DEFINER = {USER | CURRENT_USER}]FUNCTION sp_name ([function_name[,...]])[characteristic ...] routine_…

印象笔记使用

vscode安装插件登录印象笔记,开通token点击插件页面的设置填写url和tokenctrl + shift + pever new - 新建笔记 ever open - 打开笔记 ever search - 搜索笔记 ever publish - 发布笔记 ever sync - 同步笔记新建笔记下载安装windows客户端,功能比网页端更全面客户端才能导出…

(BIBM-2024) 用于药物相互作用预测的可解释多视图注意网络

用于药物相互作用预测的可解释多视图注意网络 论文标题: Interpretable multi-view attention network for drug-drug interaction prediction 论文地址: https://ieeexplore.ieee.org/document/10385757 论文期刊: BIBM 2024 摘要 药物间相互作用(DDI)在药物发现中发挥着越来…

Volatility取证工具安装教程

linux安装vol2.6 1.准备工作 准备一台虚拟机,拥有python2版本(虚拟机以kali为例) 准备Volatility2.6安装包 volatilityfoundation/volatility: An advanced memory forensics framework 准备反编译库安装包 vext01/distorm3: distorm3 2.安装步骤详解(全程在root用户下操作…

[React]AntDesign 4.x 汉化

antd汉化,适用于4.x转载自:https://blog.csdn.net/weixin_43013802/article/details/132870349全局汉化,在main.ts中引入下面代码:import{ ConfigProvider }fromantd import locale from antd/locale/zh_CN; import dayjs/locale/zh-cn;ReactDOM.createRoot(document.getEl…

线性回归(linear regression)

其实线性回归不过就是在做两件事,画一条线并判断这条线到各个点的距离。 如下图:其中这条线便是距离各个点距离总和最小的直线。也就是e+u+w+b+a总和在直线为这个情况下最小。但是什么时候这条线是我们需要的线呢?-- 线到各个点最短的时候便是。 我们先理解一下什么是凹函数…

数据库安全性与权限管理

title: 数据库安全性与权限管理 date: 2024/12/16 updated: 2024/12/16 author: cmdragon excerpt: 数据库安全性与权限管理是保护数据不被未授权访问和操控的关键所在。通过实施有效的安全措施和细粒度的权限控制,可以确保数据库的完整性、机密性和可用性。 categories:前端…

数据整合+团队协作,电商选品效率提升100%!

选品快准狠!在线协同助力电商团队做出更聪明的决策 在电商行业,“选品”决定成败。无论是发现爆款、避开雷区,还是追踪最新趋势,每一个决策都离不开团队协作与信息整合。然而,大量的电商团队仍旧面临以下常见问题: - 决策过程拉长,错失销售机会。 - 数据不统一,选品思路…

xshell类似的工具,还有哪些Xshell类似的工具呢

Xshell是一款功能强大的远程连接工具,广泛用于SSH、Telnet和Rlogin协议,帮助用户轻松连接和管理远程服务器。然而,Xshell并不是唯一的远程连接工具,市面上还有其他一些类似的工具,能够提供类似甚至更丰富的功能。那么,除了Xshell,还有哪些类似的远程连接工具呢?以下将为…

SOA整车电子电气仿真测试解决方案

经纬恒润TESTBASE 硬件在环(HIL)仿真测试平台可以为SOA电子电气系统提供高效自动化测试的一站式解决方案,为SOA车型电子电气系统的测试验证提供有力保障。概述软件定义汽车时代,汽车电子软件的功能数量和复杂度与传统汽车相比有了爆炸式增长,并且还在不断提升。以中央+区域…

线程和进程

线程 什么是线程和进程? 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进…

FastExcel 合并单元格(相当的行数据,进行合并)

目录需求思路实现Excel导出单元格全量合并策略日期格式转换接口代码ServiceDTO 使用FastExcel数据导出:官网: https://idev.cn/fastexcel/zh-CN 需求 信用代码、填报人,唯一时,将:信用代码、单位名称、填报人,进行 row 合并,并垂直居中对齐思路 这边不需要做列合并,所…