当前位置:网站首页>详解“Node实现数据加密”过程
详解“Node实现数据加密”过程
2022-08-04 05:26:00 【fcc627】
一、node实现数据加密
1.加密的分类
- 对称加密:也成为单密钥加密:同一个密钥进行加密和解密
- 非对称加密:有两把钥匙(公钥和私钥)
- 摘要算法:把任意长度的输入,根据算法生成一串固定长度的伪随机数(没有密钥,加密过程是不可逆的)
2.MD5(摘要算法)在Node中的使用方法
(1)安装crypto模块
npm install crypto
(2)使用crypto.createHash('md5')创建加密对象
(3)使用加密对象的update(明文)进行加密,然后调用,然后调用digest('hex')返回定长的十六进制字符串
3.示例
- 对用户的注册密码进行加密后存入数据库
(1)首先安装模块
npm install mysql2
npm install sequelize //安装序列化
(2)其次创建数据库连接的配置对象seqconfig.js文件。
//1.导入sequelize模块
var Sequelize=require('sequelize')
//2.配置一个数据库连接的配置对象
var mysqlDemo=new Sequelize('info','root','123456',{
host:'localhost',
port:3306,
dialect:'mysql', //数据库方言
pool:{
//数据库连接池
max:10,
min:3,
idle:10000
}
})
//3.导出数据库连接的配置对象
module.exports=mysqlDemo
(3)model的admin.js的模块,使用sequelize建立模型(类),该模型实现与数据表的orm映射
const Sequelize=require('sequelize')
const orm=require('../seqconfig')
const AdminModel=orm.define('admin', {
Id: {
type: Sequelize.INTEGER,
primaryKey: true, //主键
autocomplete: true, //自增
field: 'id'
},
userName: {
type: Sequelize.STRING,
allowNull: false, //不能为空
field: 'username'
},
userPwd: {
type: Sequelize.STRING,
allowNull: false,
field: 'userpwd'
}
},{
freezeTableName:true,
timestamp:false
})
module.exports=AdminModel
(4)使用第三步创建的模型进行crud操作
var express=require('express')
var crypto=require('crypto')
var AdminModel=require('../config/model/admin')
var router=express.Router()
// http://localhost:3000/md5/register
router.post('/register',(req, res) => {
let name=req.body.username
let pwd=req.body.userpwd
//对密码进行加密
//生成加密对象
let hash=crypto.createHash('md5')
//使用加密对象进行加密并生成十六进制字符串
let newPwd=hash.update(pwd).digest('hex')
//将用户名和加密后的密码保存到数据库中
AdminModel.create({
userName: name,
userPwd: newPwd
}).then((result)=>{
res.json({
code:1001,
msg:'保存成功'
})
}).catch((err)=>{
console.log(err)
res.json({
code:1002,
msg:'保存失败'
})
})
})
// http://localhost:3000/md5/login
router.post('/login',(req, res) => {
let name=req.body.username
let pwd=req.body.userpwd
//对密码进行加密
//生成加密对象
let hash=crypto.createHash('md5')
//使用加密对象进行加密并生成十六进制字符串
let newPwd=hash.update(pwd).digest('hex')
AdminModel.findOne({
where:{
userName:name
}
}).then((admin)=>{
if(admin.userPwd===newPwd){
res.json({
code:1002,
msg:'验证成功'
})
}else{
res.json({
code:1001,
msg:'密码错误,验证失败'
})
}
})
})
module.exports = router
(5)最后记得要配置app.js文件
var md5Router = require('./routes/md5')
app.use('/md5',md5Router)
验证:
第四步的部分代码:将用户的注册密码进行加密后存入数据库
// http://localhost:3000/md5/register
router.post('/register',(req, res) => {
let name=req.body.username
let pwd=req.body.userpwd
//对密码进行加密
//生成加密对象
let hash=crypto.createHash('md5')
//使用加密对象进行加密并生成十六进制字符串
let newPwd=hash.update(pwd).digest('hex')
//将用户名和加密后的密码保存到数据库中
AdminModel.create({
userName: name,
userPwd: newPwd
}).then((result)=>{
res.json({
code:1001,
msg:'保存成功'
})
}).catch((err)=>{
console.log(err)
res.json({
code:1002,
msg:'保存失败'
})
})
})
可以看到在postman测试成功:
我们再来看看数据库,可以看到用户的密码加密信息保存到了数据库中:
第四步骤的部分代码,验证用户是否可以登录:
// http://localhost:3000/md5/login
router.post('/login',(req, res) => {
let name=req.body.username
let pwd=req.body.userpwd
//对密码进行加密
//生成加密对象
let hash=crypto.createHash('md5')
//使用加密对象进行加密并生成十六进制字符串
let newPwd=hash.update(pwd).digest('hex')
AdminModel.findOne({
where:{
userName:name
}
}).then((admin)=>{
if(admin.userPwd===newPwd){
res.json({
code:1002,
msg:'验证成功'
})
}else{
res.json({
code:1001,
msg:'密码错误,验证失败'
})
}
})
})
可以看到在postman测试成功:
(6)前后端分离,所以我们要写一个前端页面,进行前后端交互。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style> div{
width: 500px; margin: 100px auto; } </style>
<body>
<div>
<!-- <form action="" method="post"> -->
<label>
用户名:<input type="text" id="userName" name="username">
</label>
<br><br>
<label>
密 码:<input type="password" id="userPwd" name="userpwd">
</label>
<br><br>
<button type="button" id="btn_reset">重置</button>
<button type="button" id="btn_submit">提交</button>
<!-- </form> -->
<br><br>
<span id="msg"></span>
</div>
<script src="../js/jquery-3.4.1.js"></script>
<script> $(function(){
//jQuery入口函数 //1、给登录按钮绑定click事件 $('#btn_submit').click(function(){
//2、获取用户输入的密码和用户名 let name=$('#userName').val() let pwd = $('#userPwd').val() //3.调用ajax函数向服务器发送异步的请求 $.post('http://localhost:3000/md5/login',{
username:name,userpwd:pwd},function(result){
$('#msg').html(result.msg) },'json') }) }) </script>
</body>
</html>
输入用户张三和密码123456后,显示验证成功,也就表明了登录成功:
边栏推荐
猜你喜欢

word 公式编辑器 键入技巧 | 写数学作业必备速查表

部署LVS-DR群集【实验】

Web Basics and Exercises for C1 Certification - My Study Notes

企业需要知道的5个 IAM 最佳实践

解决安装nbextensions后使用Jupyter Notebook时出现template_paths相关错误的问题

代码重构:面向单元测试

Wwise入门和实战

7.16 Day22---MYSQL (Dao mode encapsulates JDBC)

EntityComponentSystemSamples学习笔记

webrtc中视频采集实现分析(二) 视频帧的分发
随机推荐
跳转页面实时调用后台接口,更新页面数据
webrtc中的任务队列TaskQueue
Programming hodgepodge (4)
4.2 声明式事务概念
即时通讯网 即时通讯音视频开发
TensorRTx-YOLOv5工程解读(一)
《看见新力量》第四期免费下载!走进十五位科技创业者的精彩故事
OpenGLES 学习之帧缓存
C1认证之web基础知识及习题——我的学习笔记
npm init [email protected] 构建项目报错SyntaxError: Unexpected token ‘.‘解决办法
Plus版SBOM:流水线物料清单PBOM
实际开发中左菜单自定义图标点击切换
7.15 Day21---MySQL----索引
动态规划总括
Cannot read properties of null (reading ‘insertBefore‘)
Grain Mall - Basics (Project Introduction & Project Construction)
利用Jenkins实现Unity自动化构建
再识关联容器
Oracle备份脚本
嵌入式系统驱动初级【4】——字符设备驱动基础下_并发控制