0%

Koa.js 自定义koa-session加密方法

  1. 前言
  2. 自定义koa-session的加密方法

前言

Koa.js开发团队提供的session管理中间件koa-sessionkoajs/session),默认将session的内容保存在cookies中,其基本使用方法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
const session = require('koa-session');
const Koa = require('koa');
const app = new Koa();

app.keys = ['some secret hurr'];

const CONFIG = {};

app.use(session(CONFIG, app));
// or if you prefer all default config, just use => app.use(session(app));

app.listen(3000);
console.log('listening on port 3000');

其中CONFIG用于对中间件进行配置。查看源码后发现,里面用于将session加密的函数为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Decode the base64 cookie value to an object.
*
* @param {String} string
* @return {Object}
* @api private
*/
decode(string) {
const body = Buffer.from(string, 'base64').toString('utf8');
const json = JSON.parse(body);
return json;
},

/**
* Encode an object into a base64-encoded JSON string.
*
* @param {Object} body
* @return {String}
* @api private
*/
encode(body) {
body = JSON.stringify(body);
return Buffer.from(body).toString('base64');
},

仅仅做了一个base64的编码,把浏览器端cookies中保存的session字段用base64解码,直接就能获得明文,这很明显一点也不安全。

为了对session数据做进一步的加密,本文引入crypto-js,对数据进行基于PBKDF2的AES加密,关于原理请看2021年7月11日的另一篇博客,下一章节只有实现代码。

自定义koa-session的加密方法

crypto-js安装:

1
npm i crypto-js -S

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const CryptoJS = require('crypto-js');

const aesKey = 'aes key';
const aesIv = CryptoJS.enc.Hex.parse('00112233');

const encode = (body) => {
body = JSON.stringify(body);
return CryptoJS.AES.encrypt(body, aesKey, { iv: aesIv }).toString();
}

const decode = (string) => {
const body = CryptoJS.AES.decrypt(string, aesKey, { iv: aesIv })
.toString(CryptoJS.enc.Utf8).toString();
return JSON.parse(body);
}

这里直接使用CryptoJS的AES加密解密,注意encode(body)函数的参数是json对象,decode(string)函数的参数是加密后的字符串。

添加到配置:

1
2
3
4
5
6
7
8
9
10
11
const KoaSession = require('koa-session');
const app = require('koa')();

// 设置session中间件
const CONFIG = {
encode,
decode
};
app.use(KoaSession(CONFIG, app));

app.listen(8888);