Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

USB 金鑰加密 Windows 登入:批次腳本 + 群組原理實現「插入 USB 才能開機」物理雙因子認證

編輯:USB 隨身碟安裝系統

核心原理

  • 建立 USB 根目錄特徵檔案 `suo.txt` 作為「金鑰」
  • 登入腳本檢測特定磁碟機代號下是否存在該檔案
  • 不存在 → 執行 `shutdown -s -t 3` 強制關機
  • 存在 → 正常登入桌面
  • 透過群組原理「登入腳本」部署,實現系統級攔截

詳細實作步驟

1. 製作 USB 金鑰

# USB 根目錄建立特徵檔
echo. > H:\suo.txt
# 內容可自訂,如加入 UUID、時間戳、雜湊值增加難度
echo USB_KEY_2024_$(date /t) > H:\suo.txt

2. 建立檢測腳本 `CheckUSBKey.bat`

@echo off
setlocal enabledelayedexpansion

:: 設定 USB 磁碟機代號 (需根據實際環境調整或動態偵測)
set USB_DRIVE=H:
set KEY_FILE=suo.txt
set TIMEOUT=3

:: 動態偵測 USB 磁碟機 (進階,可替代固定代號)
:: for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "drivetype=2" get deviceid /value') do set USB_DRIVE=%%a

if not exist "%USB_DRIVE%\%KEY_FILE%" (
    echo.
    echo ========================================
    echo  錯誤: 未偵測到授權 USB 金鑰!
    echo  請插入授權 USB 隨身碟後重新開機。
    echo  系統將在 %TIMEOUT% 秒後自動關機。
    echo ========================================
    echo.
    shutdown -s -t %TIMEOUT% -c "未授權存取: 缺少 USB 金鑰,系統自動關機保護資料安全。"
    exit /b 1
) else (
    echo USB 金鑰驗證通過,允許登入。
    exit /b 0
)

3. 部署登入腳本 (群組原理)

  1. Win+R → `gpedit.msc`
  2. 使用者設定 → Windows 設定 → 指令碼 (登入/登出)
  3. 雙擊「登入」→「新增」→ 瀏覽選擇 `CheckUSBKey.bat`
  4. 確定 → 確定 → 關閉群組原理編輯器
  5. `gpupdate /force` 強制重新整理

4. 測試驗證

  • **插入 USB** → 重啟/登入 → 正常進入桌面 ✅
  • **拔出 USB** → 重啟/登入 → 顯示警告 → 3 秒後關機 ✅

進階強化方案

增強項目實作方式效果
動態偵測磁碟機代號WMI/PowerShell 列舉可移動磁碟、比對磁碟標籤/序號/特徵檔解決磁碟機代號漂移 (H→I→G) 問題
加密特徵檔內容USB 存放加密 Token,腳本解密驗證 (AES/RSA/雜湊)防止複製 `suo.txt` 到其他 USB 破解
硬體 ID 綁定讀取 USB VID/PID/序號/唯一 ID,腳本比對白名單綁定特定物理裝置,防止複製檔案繞過
雙因子:USB + PIN 碼腳本彈出輸入框 (VBS/PowerShell Forms) 驗證 PINUSB 遺失也無法單獨登入
登入失敗日誌/警報寫入事件檢視器/發送郵件/推播通知審計追蹤、即時告警
安全模式/PE 繞過防護啟用 BitLocker 系統盤加密 + TPM + PIN防止繞過登入腳本的離線攻擊

PowerShell 版動態偵測腳本 (推薦現代環境)

# CheckUSBKey.ps1
$KeyFileName = "suo.txt"
$AuthorizedDrives = @()  # 可預設白名單序號/VID_PID

$RemovableDrives = Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DriveType -eq 2}
$KeyFound = $false

foreach ($Drive in $RemovableDrives) {
    $KeyPath = Join-Path $Drive.DeviceID $KeyFileName
    if (Test-Path $KeyPath) {
        # 進階:驗證檔案內容雜湊/簽名
        # $Content = Get-Content $KeyPath -Raw
        # if ($Content -match "ExpectedPattern") { $KeyFound = $true; break }
        $KeyFound = $true
        break
    }
}

if (-not $KeyFound) {
    Write-Host "未偵測到授權 USB 金鑰,系統將在 3 秒後關機..." -ForegroundColor Red
    shutdown /s /t 3 /c "未授權存取: 缺少 USB 金鑰"
    exit 1
}
exit 0

群組原理登入腳本設定:`powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\CheckUSBKey.ps1"`

安全性評估與局限

  • 屬於「邏輯鎖」非「加密鎖」: 系統檔案未加密,PE/Linux/啟動修復盤可繞過讀取資料
  • 適用場景: 家庭/辦公室防止路人/同事誤操作、臨時離席鎖定、兒童誤用
  • 不適用場景: 機密資料、裝置遺失風險、針對性攻擊、合規要求
  • 真正的資料保護: **BitLocker 系統盤加密 (TPM+PIN/USB 金鑰) + 資料盤 BitLocker/EFS/VeraCrypt + 畫面鎖定 (Win+L) + 螢幕保護程式密碼**
物理金鑰的進化: 從批次腳本檢測檔案 → PowerShell 驗證硬體 ID/加密 Token → 群組原理部署 → 整合 BitLocker TPM+USB 金鑰模式 → **Windows Hello / FIDO2 安全金鑰 (YubiKey/Feitian/內建 TPM)**。現代標準:**無密碼認證、硬體根信任、公開金鑰加密、防重放/防釣魚**。這個批次腳本方案是理解原理的優秀教學案例,生產環境請升級到現代標準。
Copyright © Windows教程網 All Rights Reserved