echo "//ENCRYPTED_DATA_START:$IV:" > $ENCRYPTED_FILE cat $ENCRYPTED_FILE.tmp | base64 -w 0 >> $ENCRYPTED_FILE echo " $ENCRYPTED_FILE # 换行 rm $ENCRYPTED_FILE.tmp echo "完成。IV已嵌入文件头部。"``` 步骤2:创建对应的HTML解密加载示例 `index.html` ```html // 解密引导器 - 注意:密钥管理是关键安全风险点 const SECRET_KEY = "你的32字节密钥" 警告:前端硬编码密钥极不安全,此处仅为演示。真实场景应通过安全通道分发或使用环境特定信息派生。 async function loadAndDecryptEncryptedScript(encryptedScriptUrl) { const response = await fetch(encryptedScriptUrl); const encryptedContent = await response.text(); // 解析出IV和密文 const match = encryptedContent.match(/^""/""/ENCRYPTED_DATA_START:([0-9a-f]+):/); if (!match) { throw new Error('无效的加密文件格式'); } const ivHex = match[1]; const ciphertextBase64 = encryptedContent.substring(match[0].length).trim(); // 将密钥和IV转换为CryptoAPI可用的格式 const keyBytes = new TextEncoder().encode(SECRET_KEY); const ivBytes = Uint8Array.from(ivHex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))); // 导入密钥 const cryptoKey = await crypto.subtle.importKey( 'raw', keyBytes, { name: 'AES-CBC' }, false, ['decrypt'] ); // 解码Base64密文 const ciphertextBytes = Uint8Array.from(atob(ciphertextBase64), c => c.charCodeAt(0)); // 解密 const decryptedBytes = await crypto.subtle.decrypt( { name: 'AES-CBC', iv: ivBytes }, cryptoKey, ciphertextBytes ); // 将解密后的字节转换为JS代码字符串 const decryptedCode = new TextDecoder().decode(decryptedBytes); // 执行解密后的代码 (new Function(decryptedCode))(); // 注意:使用Function比eval稍好,它通常在全局作用域中执行,而非当前局部作用域。 } // 加载并执行加密的脚本 loadAndDecryptEncryptedScript('dist/sensitive_logic.enc.js') .catch(err => console.error('解密或执行脚本失败:', err)); ``` 此方案的关键挑战在于密钥管理。在前端硬编码密钥等同于将钥匙挂在门上,仅适用于对安全性要求不高或运行环境可控(如与服务器有安全通道)的场景。更安全的做法是结合代码分割、WebAssembly解密模块、或通过安全API在运行时从服务器获取一次性解密令牌等方式来提升安全性。 四、 高级安全建议与注意事项单纯加密JS文件并非银弹,一个健壮的安全方案需要多层次考虑: 1.密钥安全管理:绝对避免在前端代码中硬编码加密密钥。考虑使用以下策略: *动态密钥分发:在用户认证后,由服务器通过HTTPS会话动态下发本次会话使用的解密密钥或令牌。 *环境绑定:将解密密钥与设备指纹、用户身份或应用证书绑定,增加代码移植难度。 *使用密钥管理服务(KMS):在云环境中,利用AWS KMS、Azure Key Vault等服务管理密钥,前端通过授权API临时获取解密权限。 2.性能权衡:高强度混淆和运行时解密会带来额外的性能开销,包括文件体积增大和CPU计算时间。需在安全性和性能之间取得平衡,对核心关键代码进行保护即可。 3.防御深度:结合使用多种技术: *服务器端校验:核心业务逻辑和敏感检查必须在服务器端进行。 *HTTPS强制传输:防止代码在传输过程中被窃取或篡改。 *资源完整性校验(SRI):使用`
|