一、关于cookie加密

cookie加密是让客户端用户无法的值cookie明文信息,是数据安全的重要部分;一般的我们可以在保存cookie时对cookie信息进行加密,或者在res.cookie中对option对象的signed属性设置设置成true即可。

二、使用 signed 属性进行cookie加密

如下列代码:

const express = require("express");
const cookieParser = require("cookie-parser"); var app = express();
app.use(cookieParser('secret')); app.get("/",function(req,res){
res.send("主页");
}); //获取cookie
app.use(function(req,res,next){
console.log(req.signedCookies.name);
next();
}); //设置cookie
app.use(function(req,res,next){
console.log(res.cookie("name","zhangsan",{httpOnly: true,maxAge: 200000,signed: true}));
res.end("cookie为:"+req.signedCookies.name);
}); app.listen(8080);

  签名原理

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

if(opts.signed){
sign(cookieVal, secret);
} function sign (cookieVal, secret) {
return cookieVal + '.' + hmac(cookieVal, secret);
}

  如何解析

cookie-parser中间件在解析签名cookie时做了两件事:
1.将签名cookie对应的原始值提取出来
2.验证签名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);

  

如果是在判断登录时,只需将用户输入的账号进行同样加密操作在进行比较即可知道账户是否正确。
crypto所涉及的加密方式有很多,推荐大家都写模块引用,这样更方便后期的维护。

Express全系列教程之(七):cookie的加密的更多相关文章

  1. Express全系列教程之(六):cookie的使用

    一.关于Cookie 在我们关闭一个登录过的网址并重新打开它后,我们的登录信息依然没有丢失:当我们浏览了商品后历史记录里出现了我们点击过的商品:当我们推回到首页后,推荐商品也为我们选出了相似物品:事实 ...

  2. Express全系列教程之(九):将session上传至mysql数据库

    一.简介 实际引用中,有些公司在不同地区会设置不同服务器,因此就需要用到nginx以实现负载均衡,这时,将session数据保存至数据库就成为了需要面对的问题,我们以MySQL数据库为例,看看他是如何 ...

  3. Express全系列教程之(八):session的基本使用

    一.关于session session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中:当客户端访问服务器时,服务器会生成一个session对象,对象中 ...

  4. Express全系列教程之(五):Express的中间件

    一.中间件 从字面意思,我们可以了解到它大概就是做中间代理操作,事实也是如此:大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作.事实上,express是一个路由和中间件的web框架,E ...

  5. Express全系列教程之(四):获取Post参数的两种方式

    一.关于POST请求 post方法作为http请求很重要的一部分,几乎所有的网站都有用到它,与get不同,post请求更像是在服务器上做修改操作,它一般用于数据资源的更新.相比于get请求,post所 ...

  6. Express全系列教程之(三):get传参

    一.关于get请求 一般在网站开发中,get都用作数据获取和查询,类似于数据库中的查询操作,当服务器解析前台资源后即传输相应内容:而查询字符串是在URL上进行的,形如: http://localhos ...

  7. Express全系列教程之(二):Express的路由以及动态路由

    一.Express路由简介 路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式.它包含一个请求方时(methods).路径(path)和路由匹配时的函数(callback); app.m ...

  8. Express全系列教程之(一):Express的安装 和第一个程序

    前言 ndoe.js,一个基于javsscript运行环境的服务器语言,它的出现使得javascript有能力去实现服务器操作.在gitHub上ndoe.js的star数已接近6万,可见其受欢迎程度: ...

  9. Express全系列教程之(十):jade模板引擎

    一.前言 随着前端业务的不断发展,页面交互逻辑的不断提高,让数据和界面实现分离渐渐被提了出来.JavaScript的MVC思想也流行了起来,在这种背景下,基于node.js的模板引擎也随之出现. 什么 ...

随机推荐

  1. 开发portlet中的一些问题记录,portlet:resourceURL用法,portlet中通过processAction方法传值

    在portlet页面中引入js或者css,通过c或者s标签 <!--jquery实际放的地方:/MyTask/WebContent/scripts/jquery-1.8.3.min.js--&g ...

  2. Centos7中一键安装zabbix

    作者:邓聪聪 #!/bin/shlog=/root/install.logexec 2>>$log #关闭SELINUX,防火墙 systemctl stop firewalld.serv ...

  3. jenkins中slave节点连接的两种常用方式

    我们在使用jenkins的时候,一般来说肯定是有slave节点的,本来网上也有好多关于jenkins节点配置的教程,我也就不写了.简单说明一下:任务一般是在slave上面运行的.当然不是讲master ...

  4. Java学习之Java接口回调理解

    Java接口回调 在Java学习中有个比较重要的知识点,就是今天我们要讲的接口回调.接口回调的理解如果解释起来会比较抽象,我一般喜欢用一个或几个经典的例子来帮助加深理解. 举例:老板分派给员工做事,员 ...

  5. java+selenium实现web自动化

    1.环境搭建: eclipse4.8 + java1.8 + selenium-3.14 基本都是使用最新版 (1) eclipse4.5下载:http://www.eclipse.org/downl ...

  6. JavaScript入门学习笔记(JSON)

    JSON是JavaScript Object Notation的简称,是一种轻量级的数据交换格式. JSON使用JS的语法,但其格式只是一个文本,可以被任何编程语言读取病作为数据格式传递. JSON以 ...

  7. 【转载】Linux启动初始化配置文件浅析(解决source /etc/profile重启后就失效?)

    1)/etc/profile   登录时,会执行. 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. (2)/ect/bashrc   Ubuntu没有此文件,与之对应的是/ect/bash. ...

  8. AI数据分析(一)

    安装Spyder+PyQt5 在python36目录下,使用cmd打开,切换到Scripts文件下 pip install spyder pip install PyQt5 python中的库 Num ...

  9. 利用web.py快速搭建网页helloworld

    访问web.py官网 http://webpy.org/ 根据网站步骤,利用 pip install web.py 若没有 PIP 则先安装pip 运行 sudo apt-get install py ...

  10. Emacs Org-mode 2 文档结构

    2.1 章节 org-mode用* 标识章节,一个* 代表一级标题,两个* 代表两级标题,以此类推.最多6颗星,也就是最多6级. 书写格式如下: * 标题一 ** 标题二 注意, * 后有空格.不同的 ...