| | """ |
| | KSTools License Manager - 硬體資訊 API |
| | """ |
| |
|
| | from fastapi import APIRouter |
| |
|
| | router = APIRouter() |
| |
|
| | @router.get("/hardware-info") |
| | async def get_hardware_info(): |
| | """ |
| | 取得硬體指紋生成說明 |
| | |
| | 此 API 提供給 Revit Plugin 開發者參考如何生成硬體指紋 |
| | """ |
| | return { |
| | "title": "KSTools 硬體指紋生成指南", |
| | "description": "用於生成唯一硬體標識的方法", |
| | "methods": { |
| | "cpu_id": { |
| | "description": "取得 CPU 處理器 ID", |
| | "wmi_query": "SELECT ProcessorId FROM Win32_Processor", |
| | "example_code": """ |
| | using System.Management; |
| | |
| | string cpuId = ""; |
| | using (var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor")) |
| | { |
| | foreach (var obj in searcher.Get()) |
| | { |
| | cpuId = obj["ProcessorId"]?.ToString(); |
| | break; |
| | } |
| | } |
| | """ |
| | }, |
| | "motherboard_serial": { |
| | "description": "取得主機板序號", |
| | "wmi_query": "SELECT SerialNumber FROM Win32_BaseBoard", |
| | "example_code": """ |
| | using System.Management; |
| | |
| | string mbSerial = ""; |
| | using (var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard")) |
| | { |
| | foreach (var obj in searcher.Get()) |
| | { |
| | mbSerial = obj["SerialNumber"]?.ToString(); |
| | break; |
| | } |
| | } |
| | """ |
| | }, |
| | "hash_generation": { |
| | "description": "使用 SHA256 生成最終硬體指紋", |
| | "algorithm": "SHA256", |
| | "example_code": """ |
| | using System.Security.Cryptography; |
| | using System.Text; |
| | |
| | public static string GetHardwareId() |
| | { |
| | string hwInfo = cpuId + mbSerial; |
| | |
| | using (var sha256 = SHA256.Create()) |
| | { |
| | var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(hwInfo)); |
| | return Convert.ToBase64String(hash).Substring(0, 32); |
| | } |
| | } |
| | """ |
| | } |
| | }, |
| | "complete_example": { |
| | "description": "完整的硬體指紋生成類別", |
| | "filename": "HardwareFingerprint.cs", |
| | "code": """ |
| | using System; |
| | using System.Management; |
| | using System.Security.Cryptography; |
| | using System.Text; |
| | |
| | public static class HardwareFingerprint |
| | { |
| | public static string GetHardwareId() |
| | { |
| | string hwInfo = ""; |
| | |
| | // CPU ID |
| | using (var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor")) |
| | { |
| | foreach (var obj in searcher.Get()) |
| | { |
| | hwInfo += obj["ProcessorId"]?.ToString(); |
| | break; |
| | } |
| | } |
| | |
| | // 主機板序號 |
| | using (var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard")) |
| | { |
| | foreach (var obj in searcher.Get()) |
| | { |
| | hwInfo += obj["SerialNumber"]?.ToString(); |
| | break; |
| | } |
| | } |
| | |
| | // 生成 SHA256 雜湊 |
| | using (var sha256 = SHA256.Create()) |
| | { |
| | var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(hwInfo)); |
| | return Convert.ToBase64String(hash).Substring(0, 32); |
| | } |
| | } |
| | } |
| | """ |
| | }, |
| | "integration_notes": { |
| | "api_endpoints": { |
| | "activate": "/api/license/activate", |
| | "validate": "/api/license/validate" |
| | }, |
| | "required_data": { |
| | "license_code": "從管理員取得的授權碼", |
| | "hardware_id": "使用上述方法生成的硬體指紋" |
| | }, |
| | "security_notes": [ |
| | "硬體指紋應該在本地生成,不要傳送原始硬體資訊", |
| | "建議在 Plugin 啟動時進行授權驗證", |
| | "可以定期(如每小時)重新驗證授權狀態", |
| | "處理網路連接失敗的情況,提供離線模式" |
| | ] |
| | }, |
| | "troubleshooting": { |
| | "common_issues": { |
| | "wmi_access_denied": "確保應用程式有足夠權限存取 WMI", |
| | "empty_hardware_info": "某些虛擬機器可能無法取得完整硬體資訊", |
| | "hash_collision": "雖然機率極低,但應該處理雜湊碰撞的情況" |
| | }, |
| | "fallback_methods": [ |
| | "使用 MAC 地址作為備選方案", |
| | "結合多種硬體資訊提高唯一性", |
| | "允許手動輸入硬體標識符" |
| | ] |
| | } |
| | } |