
我做了套选品系统,自己用了一年多。上个月想让团队里两个运营也用上,问题立刻来了:软件得装到他们的 Win 机器上,可里面的爬虫规则、打分模型、CLIP 调用全是我吃饭的家伙,源码给出去等于把锅端走。
打包成 exe 能挡住一部分人,但稍微懂点的人 dnSpy 一拖就反编译了。我也不想搞个登录服务器天天盯着——办公室那台 Mac mini 半夜要是断网,软件就不能用了,这不行。
最后花了三个晚上,用 Claude Code 写了套离线激活系统。今天把几个关键决策摊开讲,包括我踩的坑和走的运。

项目背景:一个U盘要解决三件事
系统是 Python 写的,v2.6.2,打包后离线包 894MB(CLIP 模型占了大头)。我要发给员工的,就是这么一个塞进 U 盘的整包。
我给自己定了三条死规矩:
第一,离线能跑。员工电脑可能没网,不能依赖我的服务器。第二,不能随便复制。U 盘拷给第三个人,软件得拒绝启动。第三,我能远程吊销。万一人走了,授权要能作废。
听起来矛盾——离线又要远程吊销?后面讲我怎么绕的。
关键决策点:四个岔路口

第一个岔路:登录验证 还是 离线签名?
在线登录最省事,但违反"离线能跑"。我选了离线方案:用 Ed25519 做数字签名。我手里捏私钥,软件里只埋公钥。我给每个员工签一张授权文件,软件用公钥验签。
私钥不进代码、不进 U 盘,只在我自己机器上。员工就算把整个软件拆开,也拼不出能伪造授权的私钥。这一步是整套系统的地基。

第二个岔路:授权绑什么?
光有签名不够——一张授权文件能被复制到任何机器。得绑硬件。
我一开始想绑 MAC 地址,写到一半发现虚拟网卡、USB 网卡会让 MAC 变来变去,员工换个 WiFi 适配器软件就罢工。后来改成主板 UUID + CPU 序列号拼成机器指纹,做了个容错:两项里有一项对得上就放行。这个改动救了我,上线第二天就有台机器换了网卡,没出事。
第三个岔路:离线了,怎么远程吊销?
这是我自认最得意的一处。纯离线确实没法实时吊销,于是我加了授权有效期:每张授权只签 30 天。
员工每月找我续一次,我才重签。人要是走了,我什么都不用做——这个月一到期,软件自己就打不开了。"远程吊销"被我偷换成了"到期不续",一行联网代码都没写。后来我又加了个可选的在线检查:有网就顺手拉一下吊销名单,没网就靠有效期兜底。
第四个岔路:授权文件放哪、怎么发?
我没走邮件,直接生成一个 `.lic` 文件,微信发给员工,他丢进软件目录就行。签名验证不过、机器指纹对不上、或者过期,三种情况各弹不同提示,而不是笼统一句"激活失败"——这点是 Claude 提醒我的,排错时确实省了来回。
关键代码:验签其实就这么几行

核心逻辑不复杂,难的是想清楚上面那几个岔路。验证部分大概长这样:
```python
from nacl.signing import VerifyKey
import json, time
PUBLIC_KEY = bytes.fromhex("...") # 公钥埋在代码里,私钥在我手上
def verify_license(lic_path: str, machine_fp: str) -> bool:
raw = open(lic_path, "rb").read()
payload, sig = raw[:-64], raw[-64:]
# 1. 验签:私钥伪造不出来
VerifyKey(PUBLIC_KEY).verify(payload, sig)
data = json.loads(payload)
# 2. 机器指纹:两项对一项即可
if machine_fp not in data["fingerprints"]:
return False
# 3. 有效期:过期即作废,等于远程吊销
if time.time() > data["expire_at"]:
return False
return True
```
真正花时间的是机器指纹的容错和三种报错的区分,签名本身有现成的 `pynacl`,没必要自己造轮子。

复盘:再做一次我会改什么
这套东西跑了快一个月,两台员工机零故障。但要再来一遍,有三处我会动。
一,30 天太短了。 每月续期对我是个负担,半夜还得给人重签。下次我会按季度签,配合在线吊销名单兜底,既省心又不丢控制权。
二,机器指纹该early测试。 MAC 地址那个坑,要是我提前在员工机器上跑一遍 demo,根本不会踩。别在自己干净的开发机上想当然。
三,授权生成要做成命令行工具。 现在每签一张我都得手动改 JSON,迟早签错日期。这种重复动作,早点让 Claude 帮我封个脚本。
给同样想发软件又怕泄露源码的朋友三句话:别迷信 exe 加壳,签名才是地基;硬件绑定一定要容错;离线吊销用有效期换,比你想象的好用。
为什么关注我
我是一个人加 AI 同时跑 5 个项目的独立开发者。这套激活系统是其中选品系统的一块,真用在了自己的生意上。
关注「AI西海岸来信」,明天聊我怎么用 launchd 把几个公众号的写稿配图全自动化——同样是能省时间的真东西,少走我踩过的坑。
夜雨聆风