DistChen

Nodejs 代码"加密"

对于喜欢编程,爱折腾的人来说,使用nodejs搭建后台是一件很有意思的事情:所有的东西从头到尾都是自己来写。当然,你可以使用express 、koa这样的工具来简化你的工作,这是另一回事。如果你或者你们公司尝试打算转nodejs,那么不得不考虑的一件事情就是源代码加密的问题。因为一旦使用nodejs,这就意味着所有的代码都是明文了。

那有没有办法对源码加密使用呢?当然有,先上代码!很简单,就三个文件:

app.js

1
2
3
4
5
require("./initEnv");
let en = require("./demo_encrypt.jse");
en.sayHello("Hello World");
console.log(en.add(1,2));

initEnv.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require("fs");
require.extensions[".jse"]=function(m){
loadJS(m);
m.exports = exports;
};
function loadJS(m){
let data = fs.readFileSync(m.filename);
//执行解密后的文件
eval(decrypt(data));
}
function decrypt(data){
console.log("开始解密加密的js文件");
// 文件解密后,得到真正的内容,也就是源码
// .... doSomeThing
let str = data.toString();
console.log("完成解密");
return str;
}

demo_encrypt.jse(此文件就是nodejs模块加密后的文件,我这里并没有做任何的加密处理)

1
2
3
4
5
6
7
exports.sayHello = msg => {
console.log("You Say "+msg);
};
exports.add = (x,y)=>{
return x + y;
};

执行node app.js,结果如下:

这里写图片描述

有没有觉得上面的办法有点意思:扩展了一个.jse类型的文件,之后只要require这种类型的文件(也就是源码加密后的文件),都会按照下面的流程来执行:

  1. 取对应加密文件的内容;
  2. 对文件内容解密(肯定得采用对称的算法);
  3. 执行解密后的脚本,也就是源码;
  4. 将模块暴露出去。

其实很多工具都利用了require.extensions来做一些事情,比如babel模块注册的 .es 、.es6 、.jsx。所以这个属性你可以好好的去看下(https://nodejs.org/api/globals.html#globals_require_extensions),官方已经弃用这个属性了,但是不会移除掉,所以可以放心大胆的使用。

比如,json模块的实现:

1
2
3
4
5
6
7
8
9
require.extensions['.json'] = function(module, filename) {
var content = fs.readFileSync(filename, 'utf8');
try {
module.exports = JSON.parse(content);
} catch (err) {
err.message = filename + ': ' + err.message;
throw err;
}
};

希望这能给你带来一点思路。

坚持原创技术分享,您的支持将鼓励我继续创作!