首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

安全簡報:非管理員啟動 WCF 服務與分持機密技術實作

     編輯:關於.NET

問題一:非管理員身份啟動 WCF HTTP 服務失敗

現象:簡單的 WCF 服務在管理員身分下正常,但在一般使用者帳號下啟動時拋出 NullReferenceException,堆疊追蹤指向 HttpChannelDemuxer。

原因:WCF HTTP 通道使用 HTTP.SYS 驅動程式註冊接聽程式,HTTP.SYS 預設不允許非管理員在未明確授權的情況下註冊 URL 命名空間保留項。

解決方案:授予 URL 命名空間保留權限

方式一:使用 HTTPCFG.exe 工具

httpcfg set urlacl –u https://+:8080/MyServices/ -a "D:(A;;GX;;;S-1-5-21-...)"
  • -u:URL 前綴,必須使用強萬用字元 +(高優先序),而非弱萬用字元 *。
  • -a:SDDL 格式的 ACL,授予 GX (GENERIC_EXECUTE) 權限給指定使用者/群組 SID。

方式二:程式碼授權

透過 P/Invoke 呼叫 httpapi.dll 的 HttpSetServiceConfigurationAcl,建構 HTTP_SERVICE_CONFIG_URLACL_SET 結構。需以管理員身分執行,且程式碼需完全信任。

問題二:分持機密與雙重金鑰控制

背景:PCI-DSS 3.6.6 要求密鑰由 2-3 人分持,每人僅知部分,湊齊才能重建完整密鑰。

XOR 分割法(理論上完美)

  1. 產生 N-1 組隨機金鑰(長度等於訊息)。
  2. 將這 N-1 組金鑰與原始訊息逐位元 XOR,得到第 N 組金鑰。
  3. 分發 N 組金鑰給 N 人,銷毀原始訊息。
  4. 重建時將所有金鑰 XOR 即可還原。

缺點:任一人遺失金鑰,資料永不可復原。更進階的 Shamir 秘密分享可解決此問題(文中提及留待後續專欄)。

程式碼實作:SecretSplitter 類別

  • 使用 RNGCryptoServiceProvider 產生密碼學安全隨機數(優於 System.Random)。
  • SplitSecret(byte[], int) 回傳 List<byte[]>。
  • JoinSecret(List<byte[]>) 還原原始位元組陣列。

應用範例:ThumbDriveSecretSplitter

將分割後的 Base64 編碼金鑰寫入多個 USB 隨身碟(mysecret.txt),還原時讀取所有碟片合併。實際部署時應由程式自動收集金鑰解密,避免人工看見明文。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved