请教一下关于 激活(授权)的方案

2024-12-16 16:00:42 +08:00
 victimsss
最近有一个关于手动激活的需求,大概就是出售硬件之后,需要联网激活,不同设备的质保可能不一样。
目前我考虑的流程大概是:
1 、只生成两对密钥对,将设备私钥、服务端公钥烧录到所有设备上
2 、联网激活的时候,读取设备的指纹信息,使用设备私钥加密发送到服务端
3 、服务端用设备公钥解密确定产品信息,然后用服务端私钥生成一个 license 入库并下发
4 、设备端输入 license 后,会用服务端公钥解密,与本地指纹信息进行匹配,都符合则向云端发送激活请求
5 、最后完成激活。

想问一下:
1 、这样设计逻辑是否过于冗余或者是否闭环
2 、中间有无可能被篡改或者伪造信息。
3 、最好说一下更简单更成熟的方案。
3069 次点击
所在节点    程序员
15 条回复
89ao
2024-12-16 16:06:51 +08:00
不是设计者,我是用户。
反正经验来看,所有的不限次数的,基本都会被重复利用;
不联网续签的,也基本都会被滥用;
cassidy0134
2024-12-16 16:30:03 +08:00
@victimsss YubiHSM ,用这东西,这是个物理密钥,他插在哪儿,哪台机器能用。

本地程序调用 HSM 接口拿信息、key 、滚动 token ,上传远端验证,信息过期、key 不对、token 过期,直接拒绝。
YiXinCoding
2024-12-16 16:52:17 +08:00
看着就麻烦了。

1. 设备烧录一个全局唯一的 ID 和公钥。
2. 后台维护每个设备 ID 的质保有效期和激活状态(同一个 ID 二次激活需要人工审核)。
3. 设备联网的时候取到包含有效期和私钥签名的 License 存起来,每次设备启动的时候公钥验签一遍就完事了。

License 只有服务端的私钥能加签名,伪造不了。要破解只能重新烧录。
seers
2024-12-16 17:09:56 +08:00
其实你只需要服务端生产一套 key ,每次联网下发公钥就行,每个设备生成一套或者共用都行,设备信息用设备唯一 id 进行一次 aes 再 rsa
Huelse
2024-12-16 17:17:45 +08:00
注意对设备自身固件进行数字签名验证,并且使用 https 等加密通信,其余就正常联网验证流程。
ttkanni
2024-12-16 18:29:22 +08:00
纯用户视角,伪造设备指纹就破圈了吧,纯软(无硬件辅助)的设备指纹基本都难逃被伪造。


@YiXinCoding 此楼正解,大部分商业软件都是这个逻辑,要么人工审核要么设置 Rehost 限制。
YiXinCoding
2024-12-16 18:40:34 +08:00
ID 和程序烧录到芯片里面,然后加上物理防拆,像 POS 机、身份证读卡器、ETC 设备,这种都有防拆。谁来硬破都难。
realpg
2024-12-16 19:09:45 +08:00
既然联网了 直接要求在线登录就完事了
激活码这种旧时代的方案也就是放纵盗版以及评估没有破解价值的场景才有点意义
Lukedis
2024-12-16 20:51:19 +08:00
能联网激活,就不要考虑其他方案,除非不在意被破解
heiya
2024-12-17 11:17:06 +08:00
@YiXinCoding 请教一下。我的需求是有不能联网的情况且代码要离线部署在客户服务器上,具体的要求是一个组织下有若干台设备,一个激活码控制着组织下的所有设备。现在的问题是纯软件的情况下不能百分百保证 A 组织的激活码不能被 B 组织使用,应该怎么设计呢?
YiXinCoding
2024-12-17 11:49:54 +08:00
@heiya 用机器码啊(也就是他们说的指纹)
1. 每个服务器的机器码是唯一的(根据 CPU 、内存、硬盘、操作系统等信息生成)
2. 程序启动先把机器码打印出来,让客户把机器码发来。
3. 然后管理员再根据机器码生成一个 License 给客户。
4. 然后客户再填入 License 激活,这个 License 就只能用于这一个机器码。
heiya
2024-12-17 12:31:56 +08:00
@YiXinCoding 感谢🙏 豁然开朗
goodhunter
2024-12-18 09:52:24 +08:00
@YiXinCoding 如何确认 license 只用于这一个机器码呢?感觉是不是应该分别 给 A 组织和 B 组织每台设备一个唯一的 ID ,这个 ID 跟设备的机器码绑定,然后到管理员那里生成,客户拿到返回的 license 激活,是不是更完善?
YiXinCoding
2024-12-18 10:19:21 +08:00
@goodhunter
1. 首先 License 是经过私钥签名的,用公钥验签,其它人没有私钥无法生成签名,这个就保证了 License 无法伪造。
2. 然后 License 内容里面包含机器码、有效期。对这个内容进行加签。
3. 程序启动每次计算的机器码都是一样的,和 License 里的机器码对比,一致才算校验通过。
lyxxxh2
2024-12-18 13:19:20 +08:00

激活文件是.pem 。
我还没交钱,可能交钱的时候问我机器码吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1097909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX