2010-11-20 47 views
8

沒有違法意圖,但我們不要討論可以破解授權計劃(我知道這一點),訴諸法律通常是一種更好的威懾力(可能在你的國家,但根本沒有)。如何實施簡單的授權計劃?

不是我的選擇 - 我被告知要實施許可,只是爲了防止偶爾的黑客入侵。

什麼可能會使這個稍微不同的是,運行該軟件的個人電腦並不總是具有互聯網訪問權限。

當有人購買產品時,我可以建立許可信息&提供安裝CD。但是,如果他們想購買更多許可證會發生什麼?我不想在現場更新許可數據,但他們可能無法訪問我的服務器,也無法訪問我的服務器。

我在考慮在外部(加密)文件中擁有許可證,每個文件都包含許多許可證和到期日期。如果用戶購買了更多許可證,那麼我可以通過電子郵件發送附加文件&他們的安全清除IT員工可以將其刻錄到CD或USB棒,然後將其複製到應用程序數據目錄中。

這看起來好嗎?你能想到更好的東西嗎?你能看到問題嗎?我沒有太多的時間來實現這一點。

+0

2.5k次瀏覽和計數。在開放5年後關閉(正確)。回想起來,我意識到我應該問http://programmers.stackexchange.com/,但在那些日子裏,我只在這個網站上活躍。 – Mawg 2016-10-14 07:34:39

回答

4

如果許可證中包含大量信息,那很好。通常他們不這樣做,因此他們可以用30-50個字節左右的一些保護加密完成。這些可以通過電子郵件發送出去,粘貼&,甚至可以輸入。

至於保護方案,PKV或部分密鑰驗證是流行的。這裏有很多關於它的問題,Google搜索將提供許多不同的語言實現。

+1

+1感謝您的快速回復。文件中的唯一信息應該是許可證數量,到期日期和客戶編號。沒有太多數據。保護不需要太重。 – Mawg 2010-11-20 03:29:16

+0

對。通常,許可證包含用戶名(您的案例中的客戶編號)的散列,並且兩者一起輸入。這會進一步縮短它,因爲哈希將比名稱/數字更短。 – winwaed 2010-11-20 03:38:49

+1

我會實現一個像微軟這樣的激活系統(儘管它可以使用USB驅動器來脫機工作),以防止偶然複製,它只是簡單地將軟件安裝到超過其許可的計算機上。不幸的是,一家名爲Uniloc的公司在此方面擁有專利,並已經起訴了包括微軟在內的許多軟件公司。 – PleaseStand 2010-11-20 03:53:20

2

如果不特別在意破解嘗試這個怎麼樣:

預先生成一定數量的完全隨機密鑰(我不知道,知道......說10,000這個例子的目的)。使用SHA-1對每個密鑰進行哈希處理。

在程序中,包括包含該SHA-1哈希值的陣列,例如:

static unsigned char *keys[20] = 
{ 
    // key 8WVJ-TH6R-R7TH-DXM2 
    { 0xb2, 0x3c, 0xc2, 0xb3, 0xea, 0xa5, 0x69, 0xf6, 0xa6, 0x95, 0x8a, 0x75, 0xee, 0x76, 0x88, 0xa5, 0x71, 0xd9, 0x4a, 0x9e }, 
    // many more keys follow... 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
} 

當用戶購買了新的許可(或許可的包)給他們的密鑰的適當數量的,耐擦傷列表中的鍵,就是這樣。

當用戶在應用中輸入密鑰時,對其進行散列並迭代列表。如果你發現哈希,你很好。如果你不這樣做,鑰匙是錯誤的/未經授權的。

優點:

  • 密鑰可以是任何長度和複雜性。
  • 如果有人可以反向SHA-1,他們有更好的事情要做,而不是打破你的應用程序。
  • 簡單實施。
  • 管理簡單。
  • 如果您用完密鑰,請發出應用更新並在表的末尾添加新密鑰。
  • 不需要在線訪問。

缺點:

  • 誰想白吃白喝可以輕鬆hexedit的二進制文件來設置表自己的SHA-1值的人,然後就可以「許可證」的軟件本身。
  • 您不知道您的付費用戶是否在20臺機器上使用相同的密鑰。
  • 簡單。

該計劃可以用許多不同的方式加以改進。但這是你的起點。

2

我使用橢圓曲線的非對稱密碼學。要生成一個新的許可證密鑰,哈希用戶名(或電子郵件,可能附帶一些應用程序ID),使用您的私鑰對哈希簽名,並使用base-32進行編碼以獲得像HQYRV-OZFNZ-M3L7B-WA644-CXLG4-D7IRD-QZ6FY-GJGTO-MEXEG這樣的好密鑰。

要驗證許可證,請按上述方式對用戶名進行散列並使用您的公鑰驗證散列的簽名。

這具有很多優點:密鑰相對較短(由於使用EC而不是RSA/DSA),密鑰是「隨機的」,因爲每次爲相同的用戶名生成不同的密鑰, ,在應用程序中沒有keygen代碼,並且在沒有掌握私鑰的情況下,破解者無法寫入keygen。我有一個在GitHub上做這個的庫:https://github.com/vslavik/ellipticlicense(這是一個現在已經死了的Objective-C項目的分支,我添加了可移植的C API並做了一些其他的改進)。