1.加密
1.1 MD5加密(后端不推荐)
- MD5 是一种加密算法**,在调用这个算法的时候,提供一个密码的明文, 调用的结果,得到一个 32 位长度的密文;
- MD5 算法的特性:相同的字符串,如果多次调用 md5 算法,得到的结果,完全一样;
- MD5 算法,无法被逆向解密;
- 但是,基于 md5 算法的第二个特性,我们可以进行碰撞暴力破解;(MD5 存在被暴力破解的安全性问题)
- 为了解决 简单的明文密码,被 md5 加密后,通过 暴力破解的安全性问题, 然后就出现了加盐的MD5加密;
- 目前,md5的暴力破解,又升级了,升级到了 彩虹表;
- 由于彩虹表出现,我们推荐大家在存储网站密码的时候,使用 bcrypt 加密算法,得到加密之后的密文进行存储;
- 前端推荐使用MD5加密算法,加密后的数据发送给后端,后端再使用其他加密方式进行二次加密,安全性更强
1.2 bcrypt 加密算法(后端推荐)
- 在调用加密算法的时候,需要手动提供一个 幂次;
- 调用加密算法,得到的加密结果格式:版 本 号 版本号版本号循环的幂次$22位的随机盐 31位的密文
- 加密的随机盐和加密的幂次,和加密算法的版本号已经被存储到了真正的密文中;
1.3 项目中使用 bcrypt 的步骤
- 运行 npm i node-pre-gyp -g
- 在项目根目录中,打开终端,运行 cnpm install bcrypt -S
- 导入 bcrypt
// 导入加密的模块
const bcrypt = require(‘bcrypt’) - 定义幂次:
// 定义一个 幂次
const saltRounds = 10 // 2^10 - 调用 bcrypt.hash() 加密:
// 加密的方法
bcrypt.hash(‘123’, saltRounds, (err, pwdCryped) => {
console.log(pwdCryped)
}) - 调用bcrypt.compare()对比密码是否正确:
// 对比 密码的方法
bcrypt.compare(‘123’, ‘$2b10 1010i1ufUKnC9fXTsF9oqqvLMeDnpNfYIvhyqKRG03adiebNFPkjW3HPW’, function(err, res) {
console.log(res)
// 内部对比的过程:
// 1. 先获取 输入的明文
// 2. 获取输入的密文
// 2.1 从密文中,解析出来 bcrypt 算法的 版本号
// 2.2 从密文中,解析出来 幂次
// 2.3 从密文中,解析出来前 22 位 这个随机盐
// 3. compare 方法内部,调用 类似于 hash 方法 把 明文,幂次,随机盐 都传递进去 最终得到正向加密后的密文
// 4. 根据最新得到的密文,和 compare 提供的密文进行对比,如果相等,则 返回 true ,否则返回 false;
})
服务器模块-- 用node开启简单的服务器 监听路由 前端做md5加密 后台用bcrypt.二次加密
const express = require('express');
const path = require('path');
const cors = require('cors');
const mysql = require('mysql');
const conn= mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'root',
database:'mysql_001'
})
const bodyparser= require('body-parser');
const app = express();
const brcypt = require('bcrypt');
const salt = 10;
app.use(cors());
app.use(bodyparser.urlencoded({extended:false}));
app.use(bodyparser.json());
app.post('/register',(req,res)=>{
const body = req.body;
brcypt.hash(body.password,salt,(err,resu)=>{
// resu加密后的结果
if(err) { return res.send('加密失败')}
body.password=resu;
const sql = 'insert into mduser set ?'
conn.query(sql,body,(err,sqlresu)=>{
if(err){return res.send({status:502,msg:err.message})}
res.send({status:200,msg:'注册成功'});
})
})
// console.log(body);
})
app.post('/login',(req,res)=>{
const body = req.body;
logsql = 'select * from mduser where uname = ?';
conn.query(logsql,body.uname,(err,logresu)=>{
if(err){return res.send({status:502,msg:err.message})}
// res.send({status:200,msg:'123'})
// console.log(logresu);
if(logresu.length==1){
brcypt.compare(body.password,logresu[0].password,(err,comresult)=>{
if(err){ return res.send({status:502,msg:'操作失败'})}
if(comresult){
res.send({status:200,msg:'登录成功'});
console.log (comresult);
}else{
res.send({status:502,msg:'验证失败'});
console.log (comresult);
}
})
}
if(logresu.length==0){ return res.send({status:502,msg:'不存在此用户'});}
})
})
app.get('/', (req, res) => {
res.send('ok')
})
app.listen(3001,()=>{
console.log('http://127.0.0.1:3001');
})
login 模块
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../js/md5.js"></script>
</head>
<body>
<div>账号:<input type="text" id="uname"></div>
<div>密码:<input type="password" id="password"></div>
<button>登录</button>
</body>
<script>
$(function(){
$('button').on('click',function(){
const password = $.md5($('#password').val());
console.log(password);
$.ajax({
type:'post',
url:'http://127.0.0.1:3001/login',
data:{
uname:$('#uname').val(),
password:password,
},
dataType:'json',
success:function(result){
console.log(result);
}
})
})
})
</script>
</html>
注册模块
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../js/md5.js"></script>
</head>
<body>
<div>账号:<input type="text" id="uname"></div>
<div>密码:<input type="password" id="password"></div>
<button>注册</button>
</body>
<script>
$(function () {
$('button').on('click', function () {
// alert(1);
const password= $.md5( $('#password').val());
// console.log(password);
$.ajax({
type: 'post',
url: 'http://127.0.0.1:3001/register',
dataType: 'json',
data: {
uname: $('#uname').val(),
password: password
},
// ContentType:'application/json',
success: function (result) {
console.log(result);
}
})
// console.log(123);
})
})
</script>
</html>
版权声明:本文为qq_38152997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。