欢迎光临
我们一直在努力

Express.05 Cookie加密方式

cookie加密是让客户端无法得知cookie的明文信息,是数据安全的重要部分。本文介绍cookie在express下的两种加密方式。

使用cookie属性加密

const express = require('express')
const cookieParser = require('cookie-parser')
const app = express()

app.use(cookieParser('secret'))

app.use('/get',(req,res,next)=>{
    let cookie = req.signedCookies.name
    next()
}

app.use('/set',(req,res,next)=>{
    res.cookie('name','sry',{
        maxAge:3000,
        httpOnly:true,
        singed:true
    })
})

app.listen(3000)

express用于对cookie签名,而cookie-parser实现对签名的解析。实质上是吧cookie设置的值和cookieParser('secret')中的secret进行hamc加密,之后和cookie值加 '.' 的方式拼接起来。当option中的signed设置为true时,底层会将cookie的值与“secret”进行hmac加密。

if(opts.signed){
    sign(cookieVal,scret)
}

function sign(cookval,secret){
    return cookieVal + '.' + hmac(cookieVal,secret)
}

cookie-parser 中间件在解析签名cookie时会做两件事:

  • 将签名cookie对应的原始值提取出来
  • 验证签名cookie是否合法
//将签名后的cooki和密匙secret密匙传入
function signedCookie (str, secret) {
  if (typeof str !== 'string') {
    return undefined
  }
//验证cookie以“s:”开头
  if (str.substr(0, 2) !== 's:') {
    return str
  }
//验证签名的值是否合法,返回true或false
  var secrets = !secret || Array.isArray(secret) ? (secret || []) : [ secret ]
  for (var i = 0; i < secrets.length; i++) {
    var val = signature.unsign(str.slice(2), secrets[i])
    if (val !== false) {
      return val
    }
  }
  return false
}

上面引入自signature模块的unsign方法,他则是重新将得到的原始值进行相同签名,然后再和之前的签名值进行比较,结果相同则判断签名是否合法。 signature.unsign 代码如下:

exports.unsign = function(val, secret){
  if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided.");
  if ('string' != typeof secret) throw new TypeError("Secret string must be provided.");
  var str = val.slice(0, val.lastIndexOf('.'))
    , mac = exports.sign(str, secret);

  return sha1(mac) == sha1(val) ? str : false;
};

直接对cookie值加密

node提供了一个核心安全模块"crypto",它提供了很多安全相关的功能,如摘要运算、加密、电子签名等。这时我们可以轻易封装一个加密模块:

const crypto=require('crypto');

module.exports={
    //MD5封装
    MD5_SUFFIX:'s5w84&&d4d473885s2025s5*4s2',
    md5:function(str){
        var obj=crypto.createHash('md5');
        obj.update(str);
        return obj.digest('hex');
    }
}

使用时进行导入即可:

const common=require('./MD5');

var str='123456';
var str=common.md5(str+'s5w84&&d4d473885s2025s5*4s2');
console.log(str);

设置cookie示例:

const express=require("express");
const cookieParser=require("cookie-parser");
var cry = require('./md5');

var app=express();

var str='hello-123';
var str=cry.md5(str+'s5w84&&d4d473885s2025s5*4s2');

//设置中间件
app.use(cookieParser());

//获取加密cookie
app.use(function(req,res,next){
    console.log(req.cookies.userName);
    next();
});

//设置并加密cookie
app.use(function(req,res,next){
    res.cookie("userName", str, {maxAge: 5*60*1000, httpOnly: true});
    res.end("set ok");
});

app.listen(8080);

如果是在判断登陆,则只需要将用户输入的账号进行同样的加密操作即可进行比较账户是否正确。crypho所涉及的加密方式有很多,因此最好将其写入一个模块然后引入,便于后期维护。

赞(0) 打赏
未经允许不得转载:散人研 » Express.05 Cookie加密方式
分享到: 更多 (0)

评论 抢沙发

2 + 5 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏