提问背景 Question:
这个唯一的许可证如何生成为好,License Key,用什么样的格式比较好
软件许可证(License Key)的格式选择与生成策略
在软件产品中,设计一个优秀的许可证密钥(License Key)需要平衡安全性、易读性(用户体验)以及校验便利性。以下是行业内主流的 License Key 格式设计与生成方案:
一、 主流的 License Key 格式
1. 分段式(Classic CD-Key)
- 格式示例:
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX(通常为 25 位,由 5 组 5 位字符组成) - 字符集:为了避免混淆,通常排除容易混淆的字符,如
I、O、1、0、Z、2。推荐使用自定义的 Base32 字符集(如:A-Z, 2-9,去掉I, O, S, L等)。 - 适用场景:传统桌面软件、离线激活、需要用户手动输入或电话激活的场景。
- 优点:美观、符合用户对“激活码”的直观认知,便于手动录入。
2. 自包含型加密字符串(Sealed Payload / License File)
- 格式示例:一大段密文,形如:
LI-v1-eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTWFjIiwidHlwZSI6InBybyIsImV4cCI6MTgwMDAwMDAwMH0.signature_data_here... - 适用场景:企业级私有化部署软件。通常保存为
.lic格式的文件让用户导入。 - 优点:密钥本身包含了授权信息(如:过期时间、最大并发数、专业版/标准版、客户ID等),软件在完全离线的情况下,只需用内置的公钥即可解密并验证合法性。
3. SaaS 风格 API Key 格式
- 格式示例:前缀 + 随机高熵字符。形如:
sk_live_51Nx...或lic_std_9f82c3... - 适用场景:云服务、在线 SaaS 软件。
- 优点:一眼就能看出这个 Key 的用途(
lic代表许可证,std代表标准版),适合复制黏贴,服务端校验极其简单。
二、 如何设计并生成 License Key?
一个安全的 License Key 通常由以下几部分逻辑拼接后进行编码:
$$\text{License Data} = \text{Metadata (版本/套餐/到期日)} + \text{唯一硬件码/用户ID} + \text{防篡改签名/校验码}$$
方案 A:基于非对称加密(最安全、支持离线校验)
如果你需要软件在离线状态下能验证 Key 的真伪,必须使用非对称加密(如 RSA 或 ECC):
- 后端(私钥签名):
- 准备授权数据 JSON:
{\"user_id\": 123, \"tier\": \"pro\", \"expire_at\": \"2026-12-31\"}。 - 使用你的**私钥(Private Key)**对该 JSON 进行数字签名。
- 将
数据 + 签名组合在一起,进行 Base32 或 Base64 编码,生成最终的 License 字符串。
- 准备授权数据 JSON:
- 客户端(公钥验签):
- 软件中内置公钥(Public Key)。
- 软件解码 License 字符串,用公钥验证签名是否被篡改。若验签通过,读取其中的到期时间和版本信息。
方案 B:基于 HMAC/对称哈希(轻量级,适合在线校验)
如果软件可以联网,或者只需要轻量级校验,可以使用 HMAC 算法:
- 生成算法:
- 设定一个只有你服务器知道的
SecretKey。 - 拼接用户数据:
data = \"user_123|pro|20261231\" - 计算哈希值:
hash = HMAC_SHA256(data, SecretKey) - 取哈希值的前 10 个字符作为校验码。
- 最终 Key =
Base32(data) + \"-\" + Hash前缀。
- 设定一个只有你服务器知道的
- 校验方法:
- 软件将 Key 传给后端,后端用同样的 SecretKey 重新计算哈希,比对是否一致。
方案 C:经典的 CD-Key 算法(如 Luhn Mod N 算法)
如果你想要形如 AAAA-BBBB-CCCC-DDDD 的 16-20 位激活码,通常需要使用校验和(Checksum)算法。
- 逻辑:前三段
AAAA-BBBB-CCCC是随机数编码,代表用户或批次号;最后一段DDDD是根据前三段字符通过特定多项式算法计算出来的“校验和”。 - 作用:软件无需联网,只需运行一下校验和算法,就能瞬间判断用户是否输错了字符(防止低级手误敲错),之后再联网进行真实激活。
三、 总结与选型建议
| 场景 | 推荐格式 | 生成技术 |
| :--- | :--- | :--- |
| 在线 SaaS 软件 | lic_pro_xxxxxxxxxxxx | 强随机数(UUID/Crypto Secure Random)+ 数据库记录 |
| 私有化部署/离线商业软件 | .lic 授权文件 或 长密钥字符串 | 包含过期时间等 Meta 信息的 JWT 或 RSA加密数据包 |
| 个人桌面客户端(轻量级) | XXXX-XXXX-XXXX-XXXX | 混淆 Base32 编码 + 自定义校验位(如 Adler32/CRC32) |
开发提示:在 Go 语言中,如果要做离线激活,推荐直接使用 JWT (Go-JSON-Web-Token) 生成 License。JWT 本身就是天然的 数据 + 签名 结构,生态成熟且不易出错。