r-license

Crates.ior-license
lib.rsr-license
version1.0.0
created_at2025-12-24 10:17:42.346531+00
updated_at2025-12-24 10:17:42.346531+00
descriptionAn industrial-grade offline software licensing system with hardware binding and anti-rollback protection.
homepage
repositoryhttps://github.com/antoneo/r-license
max_upload_size
id2002957
size99,868
(antoneo)

documentation

README

R-License - Rust 离线软件授权系统

Rust Stable Version 1.0 Platforms License: MIT Enterprise Security

R-License 是一个深度防御的 Rust 离线软件授权系统

它通过“物理硬件绑定 + 非对称加密签名 + 物理单调时间计数 + 多点冗余备份”构建了一个不依赖网络的强大离线授权闭环,确保您的软件知识产权在极端离线环境下依然稳如磐石。

📑 目录

项目概述

R-License 提供了一套完整的软件授权解决方案,特别适合需要在离线环境中运行的商业软件。引入了深度防御 (Defense in Depth) 机制,通过多重审计和隐匿锚点,极大地提升了破解难度。

核心防御策略

系统在启动阶段执行以下五重防御节点

  1. 硬件绑定 (Hardware Lock):采集物理硬盘序列号和系统 GUID,确保授权文件无法在机器间拷贝。
  2. 锚点嗅探 (Anchor Sniffing):同时扫描主水位线文件与散落在系统深层的“隐匿锚点”(碎片化备份)。
  3. 一致性审计 (Consistency Audit):对比多个备份点,若主文件缺失但锚点存在,判定为“删除绕过”攻击。
  4. 时间完整性校验 (Temporal Integrity)
    • 水位线:系统时间不得早于历史记录最高点。
    • 单调时钟:使用 Instant 累加物理运行时间,防止通过倒拨时钟获得额外试用期。
  5. 软失效逻辑 (Soft Failure):校验失败时解密出错误的业务参数,使核心功能处于“不可用”状态,增加逆向调试难度。

安装指南

在您的 Cargo.toml 中添加依赖:

[dependencies]
r-license = { version = "1.0.0" }
# 如果是从私服安装
# r-license = { version = "1.0.0", registry = "your-private-registry" }

标准操作流程 (SOP)

为了确保授权系统的安全性和正确性,请遵循以下标准业务流程:

阶段 步骤 角色 操作内容 输入 输出
初始化 1. 生成密钥 开发者 运行 issuer 生成全局唯一的 Ed25519 密钥对 license_keys.bin
集成 2. 嵌入公钥 开发者 从密钥文件中提取公钥并硬编码至客户端应用 license_keys.bin 客户端二进制文件
注册 3. 获取指纹 最终用户 在目标机器运行应用或工具获取硬件 ID (HWID) HWID 字符串
签发 4. 制作授权 开发者 使用私钥 + 用户 HWID 签发授权文件 HWID, 私钥 license.lic
激活 5. 授权部署 最终用户 license.lic 放置在应用指定目录 license.lic 软件功能解锁

快速开始

1. 开发者:生成密钥对

首次使用时,需要生成用于签名的非对称密钥对。

# 生成并保存密钥对到 license_keys.bin
cargo run --bin issuer -- --save-keys --hwid "INIT"

注意license_keys.bin 包含私钥,请务必妥善保管,切勿泄露给用户。

2. 用户:获取硬件 ID

用户在其机器上运行以下代码获取 HWID:

use r_license::auth::generate_hwid;
let hwid = generate_hwid().unwrap();
println!("您的硬件ID: {}", hwid);

3. 开发者:签发授权文件

根据用户提供的 HWID 签发授权:

# 使用现有私钥签发 365 天授权
cargo run --bin issuer -- --hwid "用户HWID" --expiry 365 --keyfile license_keys.bin --output license.lic

4. 应用端:集成验证

use r_license::auth::startup_validation;

// 从 license_keys.bin 提取的 32 字节公钥
const PUBLIC_KEY: [u8; 32] = [/* ... */];

fn main() {
    // 一键启动深度验证流水线
    if let Err(e) = startup_validation("license.lic", &PUBLIC_KEY) {
        panic!("授权验证失败: {}", e);
    }
    println!("授权成功,进入业务逻辑...");
}

测试与验证流程

项目内置了严密的测试套件,模拟了完整的业务生命周期和多种攻击场景。您可以运行 cargo test --test license_test -- --nocapture 来观察以下关键流程:

  1. 密钥对生命周期测试:验证 Ed25519 密钥的生成、二进制存储及加载后的签名一致性。
  2. 硬件指纹稳定性测试:确保同一机器生成的 HWID 具有唯一性和持久性。
  3. 私钥签发闭环测试:模拟从文件加载私钥、构造授权 payload、生成 Base64 签名授权文件的全过程。
  4. 授权信息解析测试:验证系统能正确从加密授权文件中提取机器 ID、过期时间和运行时限制。
  5. 防篡改审计测试:故意修改授权文件的 payload 或签名位,验证 Ed25519 签名校验的拦截能力。
  6. 防回滚 (Anti-Rollback) 专项测试
    • 时间倒拨拦截:模拟系统时间被恶意调回,验证水位线审计是否能识别并拒绝启动。
    • 运行时长审计:验证当累计运行时间超过授权限制时,系统是否能准确触发锁定。
  7. 加密引擎安全性测试:验证 PBKDF2 (10 万次迭代) + AES-GCM-SIV 对本地安全水位线文件的保护强度。

技术架构

授权验证流水线

flowchart TD
    Start[应用启动] --> Load[加载 License.lic]
    Load --> VerifySig{Ed25519 签名验证}
    VerifySig -- 失败 --> Exit[安全退出]
    VerifySig -- 成功 --> HWID{硬件指纹匹配?}
    HWID -- 否 --> Exit
    HWID -- 是 --> Audit[一致性审计: 扫描隐匿锚点]
    Audit -- 异常 --> Exit
    Audit -- 正常 --> TimeCheck{时间水位线 & 有效期}
    TimeCheck -- 违规 --> Exit
    TimeCheck -- 正常 --> Heartbeat[启动后台心跳 & 水位线更新]
    Heartbeat --> Run[进入业务逻辑]

安全最佳实践

  1. 信任根管理:私钥必须严格保密,仅在离线签发环境使用。
  2. 编译期混淆
    • Cargo.toml 中配置 lto = truecodegen-units = 1
    • 发布前执行 strip 移除符号表:strip target/release/your_app 或在 Cargo.toml 中配置 strip = true
  3. 多点分发:主水位线文件建议放置在 AppData,隐匿锚点放置在 ProgramData 或系统目录,并设为隐藏文件。
  4. 后台心跳:程序运行时,每 5 分钟通过后台线程更新所有锚点。若更新失败(如被监控或文件锁定),应立即触发安全锁定。

许可证

本项目采用 MIT 许可证


R-License - 为您的 Rust 应用构建不可逾越的安全防线。

Commit count: 0

cargo fmt