安全哈希算法(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;
后端由两部分组成,一部分为处理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自动生成,并成功插入数据。
但是前端对用户的登录信息进行加密,意义并不大。别人可以直接截获登录信息,然后直接用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);
}
});
}
自此,完成了前后端对用户登录加密的全部流程,并存入数据库。