File size: 4,572 Bytes
ad67bb9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
"""
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 地址作為備選方案",
                "結合多種硬體資訊提高唯一性",
                "允許手動輸入硬體標識符"
            ]
        }
    }