交付
Windows EXE 安全打包與發布
提高逆向與竄改成本,同時把真正的信任邊界留在 TPM、Gateway 簽章與 Server-side 授權狀態。
先接受一個現實:Client EXE 無法保證不可破解
PyInstaller、Nuitka、混淆與反除錯都只能增加分析成本。攻擊者若能控制自己的電腦,就可能觀察、修改或 Patch Client。你的目標不是把秘密藏進 EXE,而是確保即使 EXE 被分析,也拿不到 Server Secret、TPM 私鑰或能偽造 Gateway 決策的私鑰。
選擇打包方式
方式適合場景安全觀點
PyInstaller --onedir內部工具、快速交付、容易除錯打包快,但 Python bytecode 容易分析;onefile 不是加密。
Nuitka standalone正式客戶版、希望提高逆向成本將更多程式轉為原生編譯形式,但仍不能取代線上驗證。
原生模組分層高價值演算法或 IP把敏感演算法放入簽章原生模組或 Server,可再提高保護強度。
PyInstaller 安全基線
py -m venv .venv-build
.\.venv-build\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install pyinstaller .\vendor\keygen_device_sdk.whl
py -m PyInstaller `
--noconfirm `
--clean `
--onedir `
--windowed `
--name "YourApplication" `
--collect-all keygen_device_sdk `
.\main.py
建議使用 onedir,因為可稽核檔案結構、較容易掃描與簽章。若使用 onefile,仍要理解程式執行時會解包,不能把它視為安全容器。
Nuitka 正式交付基線
python -m pip install nuitka ordered-set zstandard .\vendor\keygen_device_sdk.whl
python -m nuitka `
--standalone `
--windows-console-mode=disable `
--output-dir=build\nuitka `
--product-name="Your Application" `
--file-version=1.0.0.0 `
.\main.py
发布前的信任鏈
- 乾淨建置環境
固定 Python、依賴與打包工具版本,從乾淨 Workspace 建置。
- Authenticode 簽章
EXE、DLL 與 Installer 都完成程式碼簽章與可信時間戳。
- 產生 SHA-256 與 SBOM
記錄每個 Release Artifact 的雜湊與開源元件版本。
- 乾淨 VM 驗收
測試首次啟用、後續驗證、過期、撤銷、斷線、升級與卸載。
- 在功能入口重新驗證
打包後仍需在高價值操作前驗證 License 與 Entitlement。
state = client.validate()
state.require_valid()
state.require("YOUR_FEATURE_CODE")
run_protected_operation()
最終檢查
- EXE 與 Installer 均有 Authenticode 簽章與時間戳
- EXE 內不存在 Server Secret 或固定 License Key
- Gateway Public Key 與 Product Namespace 固定且可追蹤版本
- 高價值函式入口執行 require_valid()/require()
- Log 不包含 License Key、Token 或完整敏感 Payload
- 乾淨 VM 完成註冊、驗證、撤銷與斷線測試
- Release 產生 SHA-256、SBOM 與 Build Log