JavaScript正则表达式加密
字数 789 2025-08-11 21:26:09
JavaScript正则表达式加密技术详解
正则表达式加密概述
正则表达式在JavaScript中可以通过加密技术进行保护,主要目的是隐藏重要的、私密的字符串内容,使代码逻辑和秘密信息不易被窥探。
两种正则表达式定义方式
1. 构造函数方式
var reg = new RegExp("hello", "g");
2. 字面量方式
var reg = /hello/g;
关键区别:字面量形式的正则表达式不能直接进行加密,而构造函数形式可以。
正则表达式加密方法
方法1:Unicode转义
// 原始代码
var reg = new RegExp("hello", "g");
// 加密后
var reg = new RegExp("\u0068\u0065\u006c\u006c\u006f", "\u0067");
方法2:数组拆分
var _0x73d8bg = ["hello", "g"];
var reg = new RegExp(_0x73d8bg[0], _0x73d8bg[1]);
方法3:编码转换与异或运算
var _0xf = ["97.108.101.101.102.", "110."];
function _0x3c(str, dy_key) {
dy_key = 9;
var i, k, str2 = "";
k = str.split(".");
for(i = 0; i < k.length-1; i++) {
str2 += String.fromCharCode(k[i] ^ dy_key);
}
return str2;
}
var reg = new RegExp(_0x3c(_0xf[0]), _0x3c(_0xf[1]));
字面量正则表达式的加密方案
由于字面量形式的正则表达式无法直接加密,需要先将其转换为构造函数形式。
转换方法:使用Babel工具链
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generator = require('@babel/generator').default;
var types = require('@babel/types');
var js_code = `
function a() {
var reg1 = /hello/g;
var reg2 = new RegExp("hello", "g");
}
`;
// 1. 将代码解析为AST
var ast = parser.parse(js_code);
// 2. 遍历AST并转换正则表达式字面量
traverse(ast, {
RegExpLiteral(path) {
var pattern = path.node.pattern;
var flags = path.node.flags;
// 创建新的构造函数形式的正则表达式节点
var new_expression = types.newExpression(
types.identifier("RegExp"),
[
types.stringLiteral(pattern),
types.stringLiteral(flags)
]
);
// 替换原节点
path.replaceWith(new_expression);
}
});
// 3. 将AST重新生成代码
console.log(generator(ast).code);
转换过程解析
- 解析阶段:使用
@babel/parser将JavaScript代码转换为抽象语法树(AST) - 遍历阶段:使用
@babel/traverse查找所有正则表达式字面量节点 - 转换阶段:
- 提取正则表达式的模式(pattern)和标志(flags)
- 创建新的
new RegExp()构造函数调用节点
- 生成阶段:使用
@babel/generator将修改后的AST转换回JavaScript代码
完整加密流程
- 将所有正则表达式统一转换为构造函数形式
- 对转换后的代码应用加密技术(Unicode转义、数组拆分或编码转换)
- 可选:对整个JavaScript代码进行混淆处理
注意事项
- 加密会增加代码体积和运行时的解析开销
- 过度加密可能影响代码可维护性
- 加密不能替代真正的安全措施,敏感信息不应仅依赖前端保护
实际应用建议
- 对于需要保护的正则表达式,优先使用构造函数形式定义
- 在构建流程中集成自动化转换工具
- 结合其他代码混淆技术增强整体保护效果
- 对加密后的代码进行充分测试,确保功能不受影响
通过以上方法,开发者可以有效地保护JavaScript代码中的正则表达式,防止敏感信息被轻易获取和分析。