2016-08-17 35 views
0

我在發牌過程中產生一點點的硬件鎖。安裝前會生成(希望)唯一硬件ID,並將其編碼爲我的許可證文件的一部分。每當我的應用程序啓動時,硬件密鑰就會重新生成並與已註冊的密鑰進行比較。C#創建一個強大的硬件串口/硬件ID

其實,硬件密鑰是指第一CPU,BIOS和主板的相關信息基礎上the solution by Alex Sutu

到目前爲止好 - 這樣的CPU的變化順序 - 目前,該系統在新的CPU都處於動態鏈接虛擬環境中運行。使用失效的密鑰,軟件不再運行 - 正如我所期望的那樣,而不是我的客戶。所以我必須改變這個過程。據我所知,Windows 7(甚至以前的版本)在其激活/註冊ID內具有某種穩健性 - 較小的硬件更改並未使激活/許可證失效 - 這正是我想要模仿的內容我的許可背景。

我發現了一個小的解釋here - 這讓我覺得一般來說有以下過程:

,登記要求:

  1. 生成使用不同的設置(CPU,主板,BIOS X不同的硬件ID,無論)
  2. 許可文件

內註冊這些ID當啓動應用程序:

  1. 使用不同的設置(CPU,主板,BIOS,無論)生成X個不同的硬件ID(WMI訪問是否足夠快?替代品?)
  2. 如果超過百分之X(95?)的新生成的有等於從許可文件登記的,一切都很好,並在應用程序啓動

實際上,生成硬件使用WMI查詢的ID需要相當長的時間(4到8秒之間)。

static string identifier(string wmiClass, string wmProperty) 
     { 
      string result = ""; 
      var mc = new ManagementClass(wmiClass); 
      var moc = mc.GetInstances(); 
      foreach (var mo in moc) 
      { 
       if (result == "") 
       { 
        try 
        { 
         result = mo[wmProperty].ToString(); 
         //Only get the first one 
         break; 
        } 
        catch 
        { 
        } 
       } 
      } 
      return result; 
     } 

調用示例:

string retVal = identifier("Win32_Processor", "UniqueId"); 

所以我不幹一個有點不確定,是否考慮多個標識,考慮是正確的選擇。

因此最後一個問題: 這是建立一個強大的硬件許可還是我失去了一個點的可行辦法?其次,如果這是「最先進的」,我的WMI方法是正確的還是有更好的方法?

非常感謝!

回答

0

你的做法是正確的一般。收集不同的標識符,安全地存儲它們並頒發許可證。只要少數標識符發生變化,您就可以將存儲更新爲新值,但仍可運行應用程序。

由於收集硬件信息的時候,你可能會開始加載在「鎖定模式」的應用程序。一旦硬件標識符可用,您將檢查許可證並異步解鎖應用程序。通過這種方式,您不會受到通信延遲的限制 - 我使用此方法對遠程服務器進行了許可證驗證。

+0

嗨,羅伯特,非常感謝 - 我已經想過更新標識符存儲,但是我發現這樣一個挑戰:我的許可證是用私鑰生成的,應用程序只知道公共的許可證。存儲所有ID的許可證文件都是加密的,因此我可以發佈我的私鑰(我猜想沒有好主意)或存儲不安全的ID。我想我會留在最後一種方法,但有一點規則增強。許可證只有有效,而以前的ID至少有百分之一和原始ID有效。異步方式也是我會檢查的一種方式。 – Monga

+0

當然,你可以存儲不安全的ID。通過「安全」我的意思是「毫無問題」,這麼簡單的哈希就可以做到。只需確保刪除或替換ID由應用程序檢查。 –

+0

好的,謝謝你指出方向! – Monga