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

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,即:
前后端演示SHA1,MD5加密登录(带数据库)_第1张图片

向数据库插入用户信息代码(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会将此数据插入数据库。
前后端演示SHA1,MD5加密登录(带数据库)_第2张图片
之后再次查看robomango,可以发现,users的collection自动生成,并成功插入数据。
前后端演示SHA1,MD5加密登录(带数据库)_第3张图片

后端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);
        }
    });
}

可以看到控制台中,发来的密码后最终存入数据库的密码不同了。
前后端演示SHA1,MD5加密登录(带数据库)_第4张图片

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

你可能感兴趣的:(nodejs)