Skip to content

添加激活码

激活码这件事,本质上不是一个“输一串字符就解锁功能”的 UI 设计问题,而是一个产品控制问题。

对于小手机这类 AI-Native 产品来说,激活码通常承担 4 个目标:

  • 控制谁可以进入你的产品
  • 控制哪些功能、角色包、剧情包可以被解锁
  • 控制授权时长,比如 7 天、30 天、永久
  • 控制传播和倒卖成本,尽量减少“一码传全网”的情况

但激活码方案没有绝对最优,只有是否适合你当前阶段。

很多人一上来就问:“我应该怎么做一个最安全的激活码?”

更准确的问题应该是:

我现在要做的是教程版、测试版、私域版、还是商业版?我到底要防君子、防普通用户,还是防有逆向能力的人?

一、先明确:激活码到底在防什么

你在设计激活体系前,先要知道自己面对的主要风险是什么。

1. 防随手分享

这是最常见的场景。

比如你给 A 用户发了一串激活码,结果 A 直接把码转发到群里,几十个人都能用。

这种情况下,你需要解决的不是“顶级黑客攻击”,而是:

  • 一个码能否限制使用次数
  • 一个码能否绑定设备
  • 一个码能否设置有效期
  • 一个码泄露后能否被封禁

2. 防前端代码被看懂后直接绕过

如果你的小手机是纯 HTML + JavaScript + PWA 跑在浏览器里,那么用户天然就拥有前端代码。

这意味着:

  • 激活逻辑如果全部放前端,理论上就一定能被分析
  • 只要有人会看 DevTools、会改本地存储、会断点调试,就有绕过可能
  • 你能做的是提高门槛,而不是幻想“绝对不可破解”

3. 防批量脚本滥用

如果你的激活接口放在服务端,而且发码、验码逻辑比较直接,还可能遇到:

  • 批量试码
  • 撞库式请求
  • 伪造请求刷激活
  • 盗刷试用资格

所以当你有后端时,安全问题会从“前端逆向”扩大到“接口风控”。

二、激活码方案可以分成哪几类

站在小手机教程的视角,最常见的激活码方案可以分成 4 类。

三、四种常见方案总览

方案是否需要后端是否需要服务器验证常见加密/签名方式破解难度维护成本适合阶段
纯前端固定激活码无、简单混淆、硬编码散列很低很低Demo、临时体验版
纯前端算法型激活码对称加密、校验和、简单签名模拟低到中小范围内测
前端校验 + 本地绑定本地签名、设备指纹、加密存储私域分发、轻商业化
服务端签发/验证激活码HMAC、RSA/ECDSA、令牌签名、数据库状态校验中到高正式商业版

下面分别讲它们的优缺点。

四、方案一:纯前端固定激活码

这是最简单的一种。

做法通常是:

  • 在前端代码里写死一个或多个激活码
  • 用户输入后,前端直接比对
  • 比对成功后,在 localStorageIndexedDB 里写入“已激活”标记

优点

  • 开发最快
  • 不需要服务器
  • 不需要数据库
  • 离线也能用
  • 很适合教程演示、快速验证流程

缺点

  • 几乎等于裸奔
  • 用户只要查看前端包或调试逻辑,就能找到激活码
  • 即使找不到激活码,也可以直接手动把“已激活”状态写进本地存储
  • 一旦泄露,没有真正的撤销能力

加密方式分析

很多新手会这样想:

  • 把激活码做一次 MD5
  • 或者把字符串拆碎、混淆、Base64 编码
  • 或者把激活判断函数绕几层

这些都只能算“延缓阅读”,不算真正安全。

原因很简单:

  • 前端要完成校验,就必须拥有校验逻辑
  • 只要逻辑在用户设备上运行,就可以被看见、被修改、被跳过

破解难度

  • 对普通用户:中等偏低
  • 对会用浏览器调试工具的人:很低
  • 对会逆向的人:接近没有门槛

适合什么场景

适合:

  • 课程演示
  • 功能原型
  • 单次活动页
  • 内部临时体验版

不适合:

  • 付费分发
  • 长期商业化
  • 高价值角色包或内容包授权

五、方案二:纯前端算法型激活码

这种方案比“写死固定码”高级一点。

它的思路通常是:

  • 激活码不是固定写死,而是按某种规则生成
  • 比如包含产品 ID、过期时间、版本号、套餐类型
  • 前端拿到激活码后,按同样规则自行校验

常见形式例如:

  • VIP-20261231-PRO-XXXX
  • 把用户信息拼接后再加校验位
  • 对 payload 做对称加密后输出

优点

  • 看起来更专业
  • 可以带上期限、版本、套餐等信息
  • 不需要后端,离线可用
  • 能比固定码多一层门槛

缺点

  • 只要生成规则或密钥放在前端,迟早会被提取
  • 一旦有人摸清规律,就能批量造码
  • 很难真正做到吊销某一个已发出的码
  • 很难统计谁在用、用了几次、在哪台设备上用

是否可以使用对称加密

可以,但要知道问题在哪里。

比如你用 AES 把一些信息加密成激活码,前端再用同一个密钥解密验证。

这在工程上是能跑通的,但安全性很有限,因为:

  • 密钥必须存在前端
  • 密钥既然存在前端,就可能被拿到
  • 一旦密钥泄露,别人就可以自己生成合法激活码

所以前端里的对称加密,更接近“加门槛”,不是“建立不可伪造性”。

破解难度

  • 对普通用户:中等
  • 对懂一点前端的人:中低
  • 对专业逆向者:仍然不高

适合什么场景

适合:

  • 小范围付费测试
  • 熟人私域分发
  • 对安全要求不高,但希望看起来更正式的版本

六、方案三:前端校验 + 本地绑定

这是很多独立开发者比较常用的一类折中方案。

它的思路是:

  • 激活码本身可以包含授权信息
  • 首次激活时,把激活结果和某些设备特征做绑定
  • 后续启动时校验本地绑定结果
  • 通过本地加密存储、设备指纹、安装实例 ID 等方式提升复制成本

常见做法

比如首次打开时生成一个本地设备标识,然后:

  1. 输入激活码
  2. 前端验证激活码格式或签名
  3. 生成本地授权文件/授权记录
  4. 把“激活码 + 设备特征 + 过期信息”一起写入本地
  5. 后续启动时重复校验

优点

  • 不需要持续依赖后端
  • 可离线使用
  • 比“纯比对字符串”更难直接复制
  • 可以限制一个码只在一个浏览器环境或一个安装实例里使用

缺点

  • 浏览器里的“设备指纹”并不稳定,也不绝对可靠
  • 清缓存、换浏览器、换系统环境后,可能导致误判
  • 由于本质还是前端控制,所以仍然能被深度调试后绕过
  • 绑定越严格,售后问题越多

关于设备指纹的现实问题

很多人会把设备指纹想成“硬件序列号”那样稳定,但浏览器环境不是这样。

浏览器端常见可用信息包括:

  • User-Agent
  • 屏幕分辨率
  • 时区
  • 语言
  • 浏览器特征
  • 本地生成的安装 ID

这些信息:

  • 有的会变化
  • 有的可伪造
  • 有的在不同平台权限受限

所以设备绑定更像“增加复制成本”,而不是“真正的一机一密”。

破解难度

  • 对普通用户:中高
  • 对懂前端调试的人:中等
  • 对有经验逆向者:中等

适合什么场景

适合:

  • 私域产品
  • 小规模收费产品
  • 希望离线可用
  • 不想维护服务器,但想比基础方案更抗分享

七、方案四:服务端签发 / 服务端验证激活码

这是最正规、最可控的一种方向。

核心思路是把“最终裁决权”放回服务器。

常见做法有两种:

1. 服务端实时验证

流程是:

  1. 用户输入激活码
  2. 前端请求服务端接口
  3. 服务端检查这串码是否存在、是否过期、是否已使用、是否被封禁
  4. 服务端返回授权结果
  5. 前端保存一个短期会话状态或授权缓存

2. 服务端签发离线授权

流程是:

  1. 服务端生成带签名的授权数据
  2. 前端只负责验证签名是否正确
  3. 签名通过则激活
  4. 必要时再定期联网确认授权状态

这种方式很适合“允许离线运行,但仍希望掌握签发权”的产品。

优点

  • 可吊销、可封禁、可统计、可追踪
  • 可以做套餐、设备数量限制、过期时间、角色权限等复杂策略
  • 可以记录激活历史
  • 可以对异常请求做风控
  • 可以随时调整发码规则

缺点

  • 需要后端、数据库、部署、运维
  • 成本显著更高
  • 如果完全实时验证,就会依赖网络
  • 如果接口设计不当,也会被抓包、重放、伪造请求攻击

八、服务端方案里的加密和签名怎么选

这是很多人最容易混淆的地方。

1. 对称加密:适合“保密”,不适合“前端独立验真”

典型代表是 AES

特点是:

  • 加密和解密使用同一个密钥
  • 性能好,工程上常见
  • 适合服务器保存敏感信息、传输中保护内容

但如果要让前端自己解密并验证激活码,那密钥就得放到前端,安全性就会迅速下降。

所以:

  • 适合服务端内部处理
  • 不适合把“唯一真相”交给前端去判断

2. HMAC:适合服务端验签

HMAC 本质上也是共享密钥思路。

特点是:

  • 服务端生成签名
  • 服务端自己验证签名
  • 很适合接口请求签名、防参数篡改

但它同样不适合把密钥交给前端长期保存。

所以 HMAC 很适合:

  • 服务端校验激活参数
  • 服务端生成短期令牌
  • 接口签名校验

3. 非对称签名:适合“服务端签发,前端验证”

典型代表是 RSAECDSA

特点是:

  • 私钥只放在服务端
  • 公钥可以放在前端
  • 服务端用私钥签名
  • 前端用公钥验证签名是否有效

这类方案的最大优势是:

  • 前端可以验真
  • 但前端拿不到私钥
  • 因此攻击者难以自行伪造新授权

这就比“把 AES 密钥放前端”安全得多。

一句话理解

  • 要保密内容:优先考虑对称加密
  • 要证明“这份授权确实是官方发的”:优先考虑数字签名

九、不同方案在关键维度上的对比

1. 是否需要后端

  • 纯前端固定码:不需要
  • 纯前端算法码:不需要
  • 前端校验 + 本地绑定:不需要
  • 服务端签发/验证:需要

2. 是否需要服务器实时验证

  • 固定码:不需要
  • 算法码:不需要
  • 本地绑定:不需要
  • 服务端实时验证:需要
  • 服务端签发 + 离线验签:首次签发需要,后续可选定期联网

3. 破解难度

如果只看浏览器端:

  • 任何完全依赖前端的方案,都只能说“提高门槛”
  • 只要授权最终结果可在本地被强行修改,就无法做到真正强防护

如果加入服务端和签名体系:

  • 伪造新码会明显更难
  • 批量滥用也更容易被监控
  • 但客户端本地的授权状态仍然要防篡改

4. 维护成本

  • 前端固定码:最低
  • 前端算法码:低
  • 本地绑定:中
  • 服务端方案:最高

5. 运营灵活性

  • 前端固定码:几乎没有灵活性
  • 前端算法码:有限灵活性
  • 本地绑定:中等灵活性
  • 服务端方案:最高

十、从破解视角看:别人通常怎么破

理解攻击面,才能避免想当然。

1. 直接看前端源码

如果你把激活码、密钥、判断逻辑写在前端包里,别人可能:

  • 直接搜关键字
  • 断点调试输入逻辑
  • 查看混淆前后的变量变化
  • 找到“激活成功”的分支条件

2. 直接改本地存储

如果你只是在 localStorage 里写一个 isActivated=true,那几乎不算保护。

3. Hook 或篡改运行逻辑

攻击者可能:

  • 改写校验函数返回值
  • 篡改网络请求结果
  • 注入脚本绕过校验

4. 抓包重放

如果你有后端,但接口过于简单,别人可能:

  • 抓取一次激活成功响应
  • 重放请求
  • 模拟客户端调用流程

所以服务端方案也不是“天然无敌”,仍然要做:

  • 令牌时效控制
  • 请求签名
  • 频率限制
  • 设备/会话约束
  • 异常行为监控

十一、给小手机项目的实际建议

结合小手机这类产品的特点,我更建议按阶段选方案,而不是一步到位。

阶段 1:你还在做教程、原型、演示版本

建议:

  • 用纯前端固定码或简单算法码
  • 重点是把激活流程跑通
  • 不要花太多时间在过度安全设计上

目标不是防破解,而是验证:

  • 页面交互是否顺手
  • 激活入口是否合理
  • 用户能否理解购买和激活流程

阶段 2:你开始做小范围私域收费

建议:

  • 用“算法码 + 本地绑定”组合
  • 增加有效期、套餐类型、角色包权限字段
  • 把本地授权结构做完整一些

这时你的重点是:

  • 防止用户随手转发
  • 降低一份授权到处复制的概率
  • 保持离线体验

阶段 3:你要正式商业化

建议:

  • 上服务端
  • 采用“服务端签发 + 前端验签 + 定期联网确认”的混合方案
  • 用数据库管理激活记录、设备记录、套餐状态
  • 对高价值内容做服务端控制和灰度策略

这是兼顾体验和控制力的一条比较现实的路。

十二、推荐的选型结论

如果只给一个非常实用的结论,可以这样理解:

最省事方案

  • 纯前端固定码
  • 成本最低
  • 也最容易被破

最适合独立开发者前期

  • 前端算法码 + 本地绑定
  • 不需要持续维护后端
  • 有一定门槛
  • 适合早期变现验证

最适合长期商业化

  • 服务端签发/验证 + 非对称签名
  • 成本最高
  • 但控制力最强
  • 后续扩展空间最大

十三、不要掉进这几个误区

误区 1:以为“加密了”就等于“安全了”

不是。

如果密钥和逻辑都在前端,再复杂的加密也只是延缓分析时间。

误区 2:以为“无后端方案”可以做到绝对防破解

也不是。

无后端方案的核心价值是:

  • 成本低
  • 上线快
  • 可离线
  • 够用

而不是绝对安全。

误区 3:绑定越死越好

绑定太严,会直接影响用户体验和售后成本。

尤其是浏览器 PWA 场景,本地环境变化频率比原生 App 更高。

误区 4:一开始就设计成超重系统

如果你现在用户还没几个,却先做了复杂授权中心、设备风控、签名服务、黑名单系统,最后大概率不是“太安全”,而是“太难维护”。

十四、这篇文章的最终结论

激活码不是单纯的技术题,而是产品阶段、成本预算、攻击模型三者的平衡题。

对于小手机项目来说:

  • 没后端时,重点是提高门槛,不要幻想绝对安全
  • 有后端时,重点是把签发权、校验权、吊销权收回服务器
  • 真正长期可用的方案,通常不是单点设计,而是“前端体验 + 本地缓存 + 服务端授权”的组合

如果你只是刚开始做教程或试水产品,先做一个能用、能讲清楚、能逐步升级的激活体系,远比一开始追求完美更重要。