普通视图

发现新文章,点击刷新页面。
昨天 — 2025年7月3日首页

前端多层加密?让“伪安全”更“伪”一点(狗头)

2025年7月3日 08:38

在浏览器端做加密,听上去就有点自欺欺人。很多开发者对前端加密的态度是:

“反正浏览器都能看到源码,前端加密有意义吗?”

实际上,这个问题的答案并不简单。前端加密无法抗拒主动攻击,但在某些场景下,比如数据混淆、防小白逆向、教学演示,它仍然具备合理存在的价值。

本篇:想聊的,就是一种典型的“前端多层加密”的实现思路。

我做了一个网站,大家可以简单体验一下:encryption-demo.pages.dev/

image.png

多层加密的核心设计

前端多层加密本质上是将多个简单的加密/编码/哈希算法串联起来,形成一个相对复杂的处理链,从而提升对抗简单逆向的门槛。

image.png

  • 字符位移:基础可逆加密

  • 加盐:防止简单模式识别

  • Base64:编码增强,便于传输

  • 哈希迭代:引入不可逆过程,增加验证机制

  • 二次字符位移+编码:强化混淆效果

原理与实现

🔸 步骤1:字符位移加密

  • 类似凯撒密码,每个字母 +3
  • 极易破解,但适合作为第一步混淆
function simpleEncrypt(str) {
  return str.split('').map(c => {
    const code = c.charCodeAt(0);
    if (code >= 65 && code <= 90) {
      return String.fromCharCode(((code - 65 + 3) % 26) + 65);
    }
    if (code >= 97 && code <= 122) {
      return String.fromCharCode(((code - 97 + 3) % 26) + 97);
    }
    return c;
  }).join('');
}

🔸 步骤2:加盐

  • 在末尾增加一串随机盐(一般8位)
  • 盐 = 防止模式识别 + 防止撞库
function generateSalt(length = 8) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  return Array.from({length}).map(() => chars[Math.floor(Math.random() * chars.length)]).join('');
}

🔸 步骤3:Base64编码

  • 本质是编码,不是加密
  • 提供可见的编码形式,防止二进制乱码
const encoded = btoa(textWithSalt);

🔸 步骤4:再次字符位移

  • 加强混淆
  • 和第一次字符位移逻辑相同

🔸 步骤5:100次哈希迭代

  • 不可逆
  • 增加校验强度
  • 理论上,攻击者必须知道前面所有步骤,并暴力跑哈希
function customHash(str) {
  let hash = 0;
  for (let i = 0; i < str.length; i++) {
    hash = (hash << 5) - hash + str.charCodeAt(i);
    hash |= 0;
  }
  return hash.toString(16);
}
let result = input;
for (let i = 0; i < 100; i++) {
  result = customHash(result);
}

🔸 步骤6:最终Base64编码

  • 便于展示和传输
  • 增强文本兼容性

到底安全吗?

目标 多层加密能否达成?
防止数据被直接肉眼看到 ✅ 完全达成
防止抓包获取原始数据 ❌ 无法防御
防止逆向还原加密逻辑 ❌ 无法防御
增加小白逆向的时间成本 ✅ 有效
商业级数据安全保护 ❌ 完全不适用
教学/实验/流程展示 ✅ 非常合适

结论一句话:

这是一种“伪加密”...

尽管这种多层加密“不安全”,但它的流程化设计非常适合: 一步步拆解加密过程 —— 从字符到编码到哈希,看到每一步如何变化 —— 练习如何组合多个算法。

前端加密 ≠ 信息安全,但 ≠ 完全没用。

OK,以上便是本次分享~

欢迎加我:atar24,进技术群、交盆友,我会第一时间通过

❌
❌