前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前后端演示SHA1,MD5加密登录(带数据库)

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

作者头像
j_bleach
发布2019-07-02 11:26:16
1.2K0
发布2019-07-02 11:26:16
举报
文章被收录于专栏:前端加油站前端加油站

版权声明:本文为博主原创文章,未经博主允许不得转载。 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。 代码如下:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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):

代码语言:javascript
复制
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):

代码语言:javascript
复制
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。即:

代码语言:javascript
复制
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);
        }
    });
}

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

这里写图片描述
这里写图片描述

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SHA1,MD5简介
  • 前端加密实现
  • 后端nodejs代码
  • 后端nodejs加密
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档