js加密解密之你真的知道Base64 是什么吗

40 阅读4分钟

Base64 是一种二进制到文本的编码方案,它将任意二进制数据(如图片、文件)转换为由 64 个 ASCII 字符(A-Z, a-z, 0-9, +, /)组成的字符串。原理是将每 3 字节(24 位)数据拆分为 4 个 6 位组,每个 6 位组对应一个可打印字符。关键点在于:它只是数据格式转换,并非加密算法,不具备任何安全性。

提示:Base64 末尾常用 = 填充,确保编码后长度为 4 的倍数。


图1.png

Base64 的优缺点

优点

  1. 传输友好:纯文本格式兼容所有文本协议(如 JSON、XML、Email),避免二进制传输乱码
  2. URL/文件名安全:可通过替换 +/-_ 实现 URL-safe 变种(RFC 4648)
  3. 跨平台通用:所有编程语言均支持编解码

缺点

  1. 体积膨胀:编码后数据量增加约 33%(3 字节 → 4 字符)
  2. 零安全性:编码内容可被任何人轻松解码还原
  3. 性能损耗:编解码需额外计算资源

常见适用场景

  1. 图片/文件内嵌:将小图片转为 Data URL(<img src="data:image/png;base64,...">
  2. JWT 结构:对 Token 的 Header 和 Payload 进行 Base64 编码(注意:未加密!)
  3. 轻度数据混淆:对接口参数或配置字段编码,防止明文暴露(如 Authorization: Basic dXNlcjpwYXNz
  4. 二进制文本化:在 XML/JSON 中传输文件二进制内容

代码 Demo 示例(JavaScript)

浏览器环境(使用 btoaatob

// 编码字符串 
const original = "Hello, jsjiami!";
const encoded = btoa(original); 
console.log(encoded);  // "SGVsbG8sIGpzamlhbWkh"
 
// 解码字符串 
const decoded = atob(encoded);
console.log(decoded);  // "Hello, jsjiami!"
 
// 处理中文需先转码 
const chineseEncoded = btoa(encodeURIComponent("前端安全"));
console.log(chineseEncoded);  // "JUU1JTg5JThEJUU3JUFCJUFGJUU1JUFFJTg5JUU1JTg1JUE4"

Node.js 环境(使用 Buffer

// 编码 
const buf = Buffer.from(' 敏感数据', 'utf8');
const base64Str = buf.toString('base64');  // "5oOF5YaZ5pWw5o2u"
 
// 解码
const decodedBuf = Buffer.from(base64Str,  'base64');
console.log(decodedBuf.toString('utf8'));  // "敏感数据"

jsjiami 是什么

jsjiami 是流行的 JavaScript 代码保护工具,核心功能包括:

  • 字符串加密:将源码中的字符串转为不可读形式(常配合 Base64)
  • 代码混淆:重命名变量/函数、插入无用代码、控制流扁平化
  • 防调试:检测开发者工具并触发反调试行为
  • 加壳保护:将原始代码包裹在自解密层中

本质:通过增加逆向工程难度保护前端代码,但无法阻止专业破解。


结合使用的探讨

增强混淆策略示例

将关键数据先 Base64 编码,再经 jsjiami 混淆处理:

// 原始敏感配置 
const config = { 
  apiKey: "sk_live_123456", 
  endpoint: "/v1/payment"
};
 
// 1. Base64 编码配置 
const encodedConfig = btoa(JSON.stringify(config)); 
// "eyJhcGlLZXkiOiJza19saXZlXzEyMzQ1NiIsICJlbmRwb2ludCI6Ii92MS9wYXltZW50In0="
 
// 2. 通过 jsjiami 混淆后代码形态(模拟效果)
const _0xabcde = ["ZGVjb2RlQ29uZmln", "YXBpS2V5", ...];
function getConfig() {
  return JSON.parse(atob(_0xabcde[0])); 
}
// 实际 jsjiami 会生成更复杂的不可读结构

价值与局限

优势: ✅ 双重处理增加逆向门槛(需先理解混淆逻辑,再解码 Base64) ✅ 隐藏敏感字符串的原始形态(如 API 密钥、正则规则) ✅ 配合 jsjiami 的防调试功能,延缓攻击者分析速度

局限性: ❌ 仍可被逆向:Base64 解码是公开标准,jsjiami 混淆可被专业工具还原 ❌ 无加密强度:无法替代 AES、RSA 等真加密算法 ❌ 前端无绝对安全:密钥/算法暴露于客户端即存在风险


总结建议

  1. Base64 定位清晰:仅作为数据格式转换工具,绝不用于安全敏感场景
  2. 组合使用策略:Base64 + jsjiami 适合轻度防护(如防爬虫、防小白窥探),但需明确其边界
  3. 核心安全原则: 🔒 敏感逻辑后移:身份验证、支付处理等必须放在服务端 🔒 真加密替代伪保护:传输敏感数据使用 HTTPS + 对称加密(如 AES) 🔒 混淆只是辅助:jsjiami 作为最后一道防线,不能弥补架构缺陷

终极忠告:前端看到的任何代码/数据皆可被破解!Base64 和混淆工具只是增加成本,无法实现绝对安全。

PS:

需要js加密/js解密相关,咨询jsjiami官方客服