专栏首页前端加油站前后端演示SHA1,MD5加密登录(带数据库)

前后端演示SHA1,MD5加密登录(带数据库)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/74131038

SHA1,MD5简介

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。

前端加密实现

借助一个第三方的插件jshashes,地址https://github.com/h2non/jshashes。 代码如下:

var Hashes = require('jshashes')//sha1 插件
import url from '../../config/system.js';

class loginCtrl {
    constructor(http, $state) {
        [this.http, this.state, this.name] = [http, $state, 'login'];
        this.param = {};
    }
    login() {
        this.param.psw = new Hashes.SHA1().hex(this.param.psw);//将密码加密成sha1
        this.http.post(this.param, url.login, function () {
            console.log('登陆成功')
        })
    }
}
loginCtrl.$inject = ['http', '$state'];
export default loginCtrl;

后端nodejs代码

后端由两部分组成,一部分为处理post请求,接收数据的中间件。另一部分是链接mongoDB的。

中间件代码(app.js)

var app = require('express')();
var bodyParser = require('body-parser');
var users = require("./users.js");

app.use(bodyParser.json());
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", '3.2.1');
    if(req.method=="OPTIONS") res.send(200);
    else  next();
});

app.post('/users/login',function (req,res) {
    users(req.body);
    res.send('登陆成功');
    console.log(req.body)
})
app.get('/users/login',function (req,res) {
    res.send("bar");
})

app.listen('1090','127.0.0.1');

连接数据库代码(db.js):

var mongoose = require('mongoose'),
    DB_URL = 'mongodb://localhost:27017/bleachMG';

/**
 * 连接
 */
mongoose.connect(DB_URL);

/**
 * 连接成功
 */
mongoose.connection.on('connected', function () {
    console.log('Mongoose connection open2 to ' + DB_URL);
});

/**
 * 连接异常
 */
mongoose.connection.on('error',function (err) {
    console.log('Mongoose connection error: ' + err);
});

/**
 * 连接断开
 */
mongoose.connection.on('disconnected', function () {
    console.log('Mongoose connection disconnected');
});

module.exports = mongoose;

数据库链接好之后,只有students一个collection,即:

向数据库插入用户信息代码(users.js):

var mongoose = require('./db.js'),
    Schema = mongoose.Schema;

var UserSchema = new Schema({
    username: {type: String},                    //用户账号
    userpsw: {type: String},                        //密码
    logindate: {type: Date}                       //最近登录时间
});

var users = mongoose.model('user', UserSchema);
module.exports = function (req) {
    var user = new users({
        username: req.name,
        userpsw: req.psw,
        logindate: new Date()
    });

    user.save(function (err, res) {
        if (err) {
            console.log("Error:" + err);
        }
        else {
            console.log("Res:" + res);
        }
    });
}

当发送一条登录请求时,nodejs会将此数据插入数据库。

之后再次查看robomango,可以发现,users的collection自动生成,并成功插入数据。

后端nodejs加密

但是前端对用户的登录信息进行加密,意义并不大。别人可以直接截获登录信息,然后直接用sha1的字符串登录,因此,后端做加密才是王道。

在users.js中增加,node中自带的加密模块,crypto。即:

var mongoose = require('./db.js'),
    Schema = mongoose.Schema;
var crypto = require('crypto'); //新增模块

var UserSchema = new Schema({
    username: {type: String},                    //用户账号
    userpsw: {type: String},                        //密码
    logindate: {type: Date}                       //最近登录时间
});

var users = mongoose.model('user', UserSchema);
module.exports = function (req) {
    var secret = req.psw;
    var hash = crypto.createHmac('sha1', secret)
        .update('j_bleach')
        .digest('hex');
    var user = new users({
        username: req.name,
        userpsw: hash,
        logindate: new Date()
    });

    user.save(function (err, res) {
        if (err) {
            console.log("Error:" + err);
        }
        else {
            console.log("Res:" + res);
        }
    });
}

可以看到控制台中,发来的密码后最终存入数据库的密码不同了。

自此,完成了前后端对用户登录加密的全部流程,并存入数据库。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 了解一点浏览器的工作流程

    版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    j_bleach
  • 什么是JSON

    我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify后的字符串是怎样的?先不要急着复制粘贴到控制台...

    j_bleach
  • angular4实战(2) router

    版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    j_bleach
  • 原型和原型链

    function Foo(){} 相当于 var Foo = new Function(){}

    ConardLi
  • JavaScript学习总结(五)

    之前的几讲中我们曾经说过,JavaScript中是没有类的概念的。但是我们讲过对象,那么这个对象是怎么来的呢? 只要有函数即可创建对象

    roobtyan
  • Spring Boot集成Mybatis

    Spring Boot集成Mybatis的配置方式有很多种,可以使用mybatis-spring-boot-starter、注解方式、传统集成方式等。本文采用的...

    高广超
  • 【精选干货】区块链相关资料汇总

    精选整理了一些有关区块链方面的资料 希望大家有所收获 1、Blockchain For Dummies:初学者指南 http://byteacademy.co/...

    量化投资与机器学习微信公众号
  • 资料 | 区域链相关资料汇总

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 1、Blockchain For D...

    昱良
  • 区域链相关资料汇总

    原创干货文章第一时间送达! 1、Blockchain For Dummies:初学者指南 http://byteacademy.co/blockchain-fo...

    企鹅号小编
  • 前端基础-String 对象的正则方法

    在字符串中检索匹配正则表达式regex的子串,并替换为指定的字符串replacement;

    cwl_java

扫码关注云+社区

领取腾讯云代金券