V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
victimsss
V2EX  ›  程序员

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

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

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

    本地程序调用 HSM 接口拿信息、key 、滚动 token ,上传远端验证,信息过期、key 不对、token 过期,直接拒绝。
    YiXinCoding
        3
    YiXinCoding  
       1 天前   ❤️ 2
    看着就麻烦了。

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

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


    @YiXinCoding 此楼正解,大部分商业软件都是这个逻辑,要么人工审核要么设置 Rehost 限制。
    YiXinCoding
        7
    YiXinCoding  
       1 天前
    ID 和程序烧录到芯片里面,然后加上物理防拆,像 POS 机、身份证读卡器、ETC 设备,这种都有防拆。谁来硬破都难。
    realpg
        8
    realpg  
       1 天前
    既然联网了 直接要求在线登录就完事了
    激活码这种旧时代的方案也就是放纵盗版以及评估没有破解价值的场景才有点意义
    Lukedis
        9
    Lukedis  
       1 天前
    能联网激活,就不要考虑其他方案,除非不在意被破解
    heiya
        10
    heiya  
       1 天前
    @YiXinCoding 请教一下。我的需求是有不能联网的情况且代码要离线部署在客户服务器上,具体的要求是一个组织下有若干台设备,一个激活码控制着组织下的所有设备。现在的问题是纯软件的情况下不能百分百保证 A 组织的激活码不能被 B 组织使用,应该怎么设计呢?
    YiXinCoding
        11
    YiXinCoding  
       1 天前
    @heiya 用机器码啊(也就是他们说的指纹)
    1. 每个服务器的机器码是唯一的(根据 CPU 、内存、硬盘、操作系统等信息生成)
    2. 程序启动先把机器码打印出来,让客户把机器码发来。
    3. 然后管理员再根据机器码生成一个 License 给客户。
    4. 然后客户再填入 License 激活,这个 License 就只能用于这一个机器码。
    heiya
        12
    heiya  
       1 天前
    @YiXinCoding 感谢🙏 豁然开朗
    goodhunter
        13
    goodhunter  
       3 小时 6 分钟前
    @YiXinCoding 如何确认 license 只用于这一个机器码呢?感觉是不是应该分别 给 A 组织和 B 组织每台设备一个唯一的 ID ,这个 ID 跟设备的机器码绑定,然后到管理员那里生成,客户拿到返回的 license 激活,是不是更完善?
    YiXinCoding
        14
    YiXinCoding  
       2 小时 39 分钟前
    @goodhunter
    1. 首先 License 是经过私钥签名的,用公钥验签,其它人没有私钥无法生成签名,这个就保证了 License 无法伪造。
    2. 然后 License 内容里面包含机器码、有效期。对这个内容进行加签。
    3. 程序启动每次计算的机器码都是一样的,和 License 里的机器码对比,一致才算校验通过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3410 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.