Express/mongoose对数据库中密码加密处理
项目搭建及配置
使用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
提供了两个同步的方法:compareSync
和 hashSync
。这两个方法与异步方法 compare
和 hash
的作用相同,只是它们是同步调用的,而不是通过回调函数来处理结果。这些同步方法可以更简单地在代码中使用,但不能在 Node.js 事件循环中执行,并且如果密码哈希或验证操作非常耗时,则会阻塞应用程序。
-
bcryptjs.compareSync(data, encrypted)
方法:
- 这个方法同步比较明文数据和已加密的数据是否匹配。
data
?是未加密的数据。encrypted
?是已加密的数据。- 如果匹配返回?
true
,否则返回?false
。
-
bcryptjs.hashSync(data, saltRounds)
方法:
- 这个方法将一个数据(通常是用户密码)同步进行哈希处理,并返回生成的哈希值。
data
?是需要被哈希的原始数据(例如用户输入的密码)。saltRounds
?指定哈希计算的轮数,通常建议设置为 10 到 12 之间的数值。- 返回生成的哈希字符串。
这两个同步方法与异步方法的使用方式相同,只是它们不需要回调函数来处理结果。如果应用程序的性能要求较低,并且不需要异步处理密码哈希和验证过程,那么可以使用这些同步方法。否则,建议尽可能使用异步方法,以充分利用 Node.js 的非阻塞 I/O 特性。
###
验证结果展示:
注册:
登录验证:
?账号不正确时
密码不正确时?
账号密码都正确时
?
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!