简单加密技术实现(node)

1.加密

1.1 MD5加密(后端不推荐)

  1. MD5 是一种加密算法**,在调用这个算法的时候,提供一个密码的明文, 调用的结果,得到一个 32 位长度的密文;
  2. MD5 算法的特性:相同的字符串,如果多次调用 md5 算法,得到的结果,完全一样;
  3. MD5 算法,无法被逆向解密;
  4. 但是,基于 md5 算法的第二个特性,我们可以进行碰撞暴力破解;(MD5 存在被暴力破解的安全性问题)
  5. 为了解决 简单的明文密码,被 md5 加密后,通过 暴力破解的安全性问题, 然后就出现了加盐的MD5加密;
  6. 目前,md5的暴力破解,又升级了,升级到了 彩虹表;
  7. 由于彩虹表出现,我们推荐大家在存储网站密码的时候,使用 bcrypt 加密算法,得到加密之后的密文进行存储;
  8. 前端推荐使用MD5加密算法,加密后的数据发送给后端,后端再使用其他加密方式进行二次加密,安全性更强

1.2 bcrypt 加密算法(后端推荐)

  1. 在调用加密算法的时候,需要手动提供一个 幂次;
  2. 调用加密算法,得到的加密结果格式:版 本 号 版本号循环的幂次$22位的随机盐 31位的密文
    • 加密的随机盐和加密的幂次,和加密算法的版本号已经被存储到了真正的密文中;

1.3 项目中使用 bcrypt 的步骤

  1. 运行 npm i node-pre-gyp -g
  2. 在项目根目录中,打开终端,运行 cnpm install bcrypt -S
  3. 导入 bcrypt
    // 导入加密的模块
    const bcrypt = require(‘bcrypt’)
  4. 定义幂次:
    // 定义一个 幂次
    const saltRounds = 10 // 2^10
  5. 调用 bcrypt.hash() 加密:
    // 加密的方法
    bcrypt.hash(‘123’, saltRounds, (err, pwdCryped) => {
    console.log(pwdCryped)
    })
  6. 调用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版权协议,转载请附上原文出处链接和本声明。