Express/mongoose对数据库中密码加密处理

发布时间:2023年12月25日

项目搭建及配置

使用Express创建一个服务端项目 创建express此处有详解

不在过多讲解以上的配置及创建

###

明确为甚么要对重要数据加密?

密码加密是一种保护用户数据安全的重要措施。加密密码可以确保未经授权的人无法访问用户帐户或敏感信息,即使数据库或服务器被攻击者入侵也是如此,无法获取到你的密码。

  • 防止数据泄露:如果用户密码以明文存储在数据库中,则任何人都可以轻松地访问它们。如果数据库或服务器被攻击,则攻击者可以窃取这些密码并访问用户数据。使用加密密码可以防止这种情况发生。

  • 保护用户隐私:用户密码通常与他们的个人身份信息和其他敏感数据相关联。如果这些密码被暴露,攻击者可以窃取用户身份并利用其个人信息进行恶意活动。通过加密密码,可以确保用户数据保持私密。

  • 符合法规要求:在某些情况下,法规可能要求组织对存储在其系统中的用户数据进行加密。例如,根据欧洲通用数据保护条例(GDPR)等法规,组织必须采取适当的安全措施来确保个人数据的保密性和完整性。

###

bcryptjs 模块是什么?

bcryptjs 模块是一个用于密码哈希和验证的 JavaScript 库。它提供了一种安全的方式来存储用户密码,以防止密码泄露时的潜在风险。

bcryptjs 使用了 bcrypt 算法,这是一个基于 Blowfish 密码加密算法的适用于密码哈希的函数。bcrypt 算法通过将密码进行多次迭代的哈希处理,并添加随机的 salt(盐)值来增加密码的安全性。这种方式使得密码哈希的破解变得非常困难,即使在大规模的计算资源攻击下也能提供较高的安全性。

使用 bcryptjs 模块,开发者可以轻松地对用户密码进行哈希处理,并将密码哈希值存储在数据库中。当需要验证用户密码时,可以使用相同的哈希算法和 salt 值来比较用户输入的密码与存储的哈希值是否匹配,从而验证密码的正确性。

###

安装bcryptjs模块

npm i bcryptjs  // bcryptjs模块

###?

接口配置

直接在文件中配置即可

var express = require("express");
var router = express.Router();
const mongoose = require("mongoose");
const bcryptjs = require("bcryptjs"); // 引入bcryptjs模块

const User = mongoose.model(
  "user",
  {
    username: String,
    password: {
      type: String,
      set(val) {
        // 每次数据库进行修改或插入时都会执行set
        return bcryptjs.hashSync(val); // 对存入数据库的密码进行加密
      },
    },
  },
  "user"
);

router.post("/regs", async (req, res) => {
  // 上面定义了set方法所以这里直接入库
  await User.create(req.body);
  res.send({ code: 200, message: "注册成功" });
});

router.post("/login", async (req, res) => {
  let username = req.body.username;
  let password = req.body.password;
  let user = await User.findOne({ username });
  if (!user) {
    return res.send({ code: 401, message: "没有这个用户!" });
  }
  // 使用bcryptjs.compareSync方法进行验证,第一个参数是要验证的字符串,第二个参数是加密过的字符串
  if (!bcryptjs.compareSync(password, user.password)) {
    return res.send({ code: 402, message: "密码错误!" });
  }
  res.send({ code: 200, message: "登录成功!" });
});
module.exports = router;

###

bcryptjs提供的方法

bcryptjs 提供了两个同步的方法:compareSynchashSync。这两个方法与异步方法 comparehash 的作用相同,只是它们是同步调用的,而不是通过回调函数来处理结果。这些同步方法可以更简单地在代码中使用,但不能在 Node.js 事件循环中执行,并且如果密码哈希或验证操作非常耗时,则会阻塞应用程序。

  1. bcryptjs.compareSync(data, encrypted) 方法:

  • 这个方法同步比较明文数据和已加密的数据是否匹配。
  • data?是未加密的数据。
  • encrypted?是已加密的数据。
  • 如果匹配返回?true,否则返回?false
  1. bcryptjs.hashSync(data, saltRounds) 方法:

  • 这个方法将一个数据(通常是用户密码)同步进行哈希处理,并返回生成的哈希值。
  • data?是需要被哈希的原始数据(例如用户输入的密码)。
  • saltRounds?指定哈希计算的轮数,通常建议设置为 10 到 12 之间的数值。
  • 返回生成的哈希字符串。

这两个同步方法与异步方法的使用方式相同,只是它们不需要回调函数来处理结果。如果应用程序的性能要求较低,并且不需要异步处理密码哈希和验证过程,那么可以使用这些同步方法。否则,建议尽可能使用异步方法,以充分利用 Node.js 的非阻塞 I/O 特性。

###

验证结果展示

注册:

登录验证:

?账号不正确时

密码不正确时?

账号密码都正确时

?

?

文章来源:https://blog.csdn.net/m0_74060440/article/details/135189410
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。