- 前言
- 自定义koa-session的加密方法
前言
Koa.js开发团队提供的session管理中间件koa-session
(koajs/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));
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(string) { const body = Buffer.from(string, 'base64').toString('utf8'); const json = JSON.parse(body); return json; },
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 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')();
const CONFIG = { encode, decode }; app.use(KoaSession(CONFIG, app));
app.listen(8888);
|