KyrosDev's picture
Initial commit: Complete KSTools License Management System
ad67bb9
"""
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 地址作為備選方案",
"結合多種硬體資訊提高唯一性",
"允許手動輸入硬體標識符"
]
}
}