当前位置:网站首页>详解“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后,显示验证成功,也就表明了登录成功:
边栏推荐
猜你喜欢
代码重构:面向单元测试
Summary of MySQL database interview questions (2022 latest version)
Swoole学习(二)
Linux环境下redis的下载、安装和启动(建议收藏)
Can 't connect to MySQL server on' localhost3306 '(10061) simple solutions
基于C语言的学生信息管理系统_(更新版)_(附源码和安装包)_课程设计_**往事随風**的博客
Deploy LVS-DR cluster [experimental]
sql server如何得到本条记录与上一条记录的差异,即变动值
npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
解决JDBC在web工程中无法获取配置文件
随机推荐
Summary of MySQL database interview questions (2022 latest version)
TSF微服务治理实战系列(一)——治理蓝图
Canal mysql data synchronization
LCP 17. Quick Calculation Robot
7.18 Day23----标记语言
Camera2 闪光灯梳理
4.3 Annotation-based declarative transactions and XML-based declarative transactions
《看见新力量》第四期免费下载!走进十五位科技创业者的精彩故事
webtrc 中VideoAdapter类中的作用及局限
OpenGLES 学习之帧缓存
将自定义类型作为关联容器的key
C language -- operator details
DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片
Several ways to heavy
注意!软件供应链安全挑战持续升级
lambda函数用法总结
string类简介
力扣:343. 整数拆分
[原创]STL容器map和unordered_map性能,创建,插入,随机访问速度对比!
去重的几种方式