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);

转换过程解析

  1. 解析阶段:使用@babel/parser将JavaScript代码转换为抽象语法树(AST)
  2. 遍历阶段:使用@babel/traverse查找所有正则表达式字面量节点
  3. 转换阶段
    • 提取正则表达式的模式(pattern)和标志(flags)
    • 创建新的new RegExp()构造函数调用节点
  4. 生成阶段:使用@babel/generator将修改后的AST转换回JavaScript代码

完整加密流程

  1. 将所有正则表达式统一转换为构造函数形式
  2. 对转换后的代码应用加密技术(Unicode转义、数组拆分或编码转换)
  3. 可选:对整个JavaScript代码进行混淆处理

注意事项

  1. 加密会增加代码体积和运行时的解析开销
  2. 过度加密可能影响代码可维护性
  3. 加密不能替代真正的安全措施,敏感信息不应仅依赖前端保护

实际应用建议

  1. 对于需要保护的正则表达式,优先使用构造函数形式定义
  2. 在构建流程中集成自动化转换工具
  3. 结合其他代码混淆技术增强整体保护效果
  4. 对加密后的代码进行充分测试,确保功能不受影响

通过以上方法,开发者可以有效地保护JavaScript代码中的正则表达式,防止敏感信息被轻易获取和分析。

JavaScript正则表达式加密技术详解 正则表达式加密概述 正则表达式在JavaScript中可以通过加密技术进行保护,主要目的是隐藏重要的、私密的字符串内容,使代码逻辑和秘密信息不易被窥探。 两种正则表达式定义方式 1. 构造函数方式 2. 字面量方式 关键区别 :字面量形式的正则表达式不能直接进行加密,而构造函数形式可以。 正则表达式加密方法 方法1:Unicode转义 方法2:数组拆分 方法3:编码转换与异或运算 字面量正则表达式的加密方案 由于字面量形式的正则表达式无法直接加密,需要先将其转换为构造函数形式。 转换方法:使用Babel工具链 转换过程解析 解析阶段 :使用 @babel/parser 将JavaScript代码转换为抽象语法树(AST) 遍历阶段 :使用 @babel/traverse 查找所有正则表达式字面量节点 转换阶段 : 提取正则表达式的模式(pattern)和标志(flags) 创建新的 new RegExp() 构造函数调用节点 生成阶段 :使用 @babel/generator 将修改后的AST转换回JavaScript代码 完整加密流程 将所有正则表达式统一转换为构造函数形式 对转换后的代码应用加密技术(Unicode转义、数组拆分或编码转换) 可选:对整个JavaScript代码进行混淆处理 注意事项 加密会增加代码体积和运行时的解析开销 过度加密可能影响代码可维护性 加密不能替代真正的安全措施,敏感信息不应仅依赖前端保护 实际应用建议 对于需要保护的正则表达式,优先使用构造函数形式定义 在构建流程中集成自动化转换工具 结合其他代码混淆技术增强整体保护效果 对加密后的代码进行充分测试,确保功能不受影响 通过以上方法,开发者可以有效地保护JavaScript代码中的正则表达式,防止敏感信息被轻易获取和分析。