歷經十年/頭髮都快掉光/秘鑰生成器終極版/機器碼/到期功能限制/執行時間限制/日期防篡改/跨平臺

飞扬青云發表於2024-10-04

一、專案介紹

1.0 前言說明

標題一點都不誇張,從第一版的秘鑰生成器到今天這個版本,確實經歷了十年的時間,最初的版本做的非常簡陋,就是搞了個異或加密,控制執行時間,後面又增加裝置數量的控制,然後就是到期時間的限制。這種有個巨大缺陷就是可複製性,如果將授權的秘鑰檔案,複製到其他電腦也是能正常執行的,老闆急的哇哇叫,這怎麼行呢,於是V2.0又增加了機器碼的功能,最開始做的windows版本,後面遇到使用者又需要linux和mac系統執行,不斷增加了對應的唯一機器碼的識別。這樣就複製無法執行,必須一臺機器對應一個秘鑰,可是後面又發現寫死也不行,所有又加了開關,可以開啟是否啟用機器碼限制。

陸陸續續完善和驗證了很多年,總體效果挺好,近期又有新的需求,那就是希望能夠控制到期時間後限制部分功能,而不是不能執行,比如到期後影片右下角加上水印,使用者還可以將過期的秘鑰檔案發過來,更新秘鑰延長試用期限,這樣就非常完美了。而且整個秘鑰認證都是獨立的靜態函式,整合機器方便,就幾行程式碼就行。

1.1 秘鑰生成

  1. 由於支援多種功能限制,所以每一種功能都做了開關來開啟,只有當開關開啟後,對應設定的值才會起作用。
  2. 到期日期用來控制到期後限制部分功能,但是程式可以繼續正常執行,也不彈窗提示。
  3. 到期時間用來控制最終可以執行程式的時間,到期後程式無法執行,會自動彈窗提示過期。
  4. 執行時間用來控制每次程式啟動後,可以執行多久,單位分鐘,如果設定30則表示每次程式啟動後開始計時,知道執行滿30分鐘自動彈窗提示。
  5. 機器標識也就是機器碼,支援windows、linux、mac系統,每臺裝置都是唯一,可以選擇開啟或者不開啟機器標識的限制。開啟後一個秘鑰檔案只能用到唯一的一臺裝置上。
  6. 最大數量用來控制軟體中支援的裝置的最大數量,比如控制攝像頭最多新增5個,超過則彈出提示不允許繼續新增。
  7. 加密數值用來生成秘鑰的唯一密碼,一般不同的軟體可以指定不同的加密數值,這個數值用於加密解密。
  8. 到期日期和到日時間後面會顯示剩餘多少天字樣,如果已經過期,則顯示超過多少天字樣。
  9. 單擊本機標識按鈕,自動識別本機的機器碼,填入文字框中。
  10. 單擊讀取秘鑰,自動讀取當前目錄下的key.lic檔案,識別對應的內容並解析反饋顯示到介面上。
  11. 單擊寫入秘鑰,寫入秘鑰檔案。然後可以將新生成的秘鑰檔案,複製到可執行檔案對應目錄,同檔案替換即可。

1.2 更新秘鑰

  1. 實際專案中都是以更新秘鑰為主。本工具作為秘鑰分發的控制端,牢牢控制在老闆手裡,用於控制收款進度。比如款沒付完,可以設定尾款的最終日期為到期日期,之前正常執行,到了到期日期還沒付完尾款,則自動限制部分功能的使用,比如影片上打上水印。程式能夠繼續正常執行,但是使用者可以看到要交尾款了。
  2. 軟體在新的裝置首次執行,或者刪除秘鑰檔案再次執行,會自動生成帶有唯一機器碼標識的秘鑰檔案,但是該檔案是沒有授權過的,需要發給控制端這邊用來生成秘鑰,相當於授權。
  3. 第一步,當使用者端看到軟體未授權請授權字樣,將key.lic檔案發給老闆,老闆將這個檔案複製到keytool.exe檔案同一目錄。
  4. 第二步,雙擊開啟keytool.exe,會自動讀取目錄下的key.lic檔案,也可以單擊讀取秘鑰按鈕。
  5. 第三步,勾選對應要限制的功能,選擇到期日期等引數,最後寫入秘鑰。然後將新生成的key.lic檔案發給使用者同檔案替換即可。
  6. 這種邏輯策略有個好處就是,可以在原有的秘鑰控制基礎上進行更新,而不是重新生成。比如之前限制了執行時間,同時也限制了最大數量,在不知情的情況下,你並不知道使用者那邊的秘鑰是控制了哪些功能,這樣也就不好在原來的基礎上更新限制。尤其是到期日期,有時候只是希望在原來的基礎上,能夠延長試用時間而已。

1.3 程式碼使用

  1. 第一步,將秘鑰元件目錄core_key複製到你的專案的上一級目錄。
  2. 第二步,開啟pro專案檔案,加一行 include ($$PWD/../core_key/core_key.pri) 引入元件。
  3. 第三步,程式碼檔案引入標頭檔案 #include "keyhelper.h" ,開始使用程式碼。
//指定秘鑰檔案路徑
KeyHelper::keyFile = "./key.lic";
//讀取秘鑰檔案/讀取後會自動開啟各種認證和校驗
KeyHelper::readKey();

//在需要控制數量的地方呼叫校驗數量函式
int count = ui->listWidget->count();
if (!KeyHelper::checkCount(count)) {
    return;
}

//如果需要防日期時間篡改/程式結束的時候寫入最後一次的正確時間
KeyHelper::writeKey();

二、功能特點

  1. 多種開關開啟不同的秘鑰功能限制。
  2. 可以開啟機器碼限制,一機一碼,一臺裝置對應唯一的一個機器碼,自動獲取機器碼和秘鑰檔案的機器碼核對。
  3. 可以開啟到期功能限制,超過了指定的日期後,對執行功能增加限制,比如影片上增加水印。程式還可以繼續執行,只是功能有限制。
  4. 可以開啟到期時間限制,到了指定的日期後,彈出到期提醒,自動關閉程式,程式無法繼續執行。
  5. 可以開啟執行時間限制,比如指定程式只能執行30分鐘,每次開啟程式後,執行30分鐘,自動關閉程式,再次開啟程式,還可以繼續執行30分鐘。
  6. 可以開啟最大數量限制,比如設定最大數量5,則該軟體中可以檢測新增的裝置數量是否超過5個,超過則不允許繼續新增。
  7. 功能限制可以選擇一種或者多種,滿足各種需求場景。
  8. 內建防日期時間篡改功能,自動記憶秘鑰寫入時間和秘鑰正常執行時間,一旦檢測到電腦時間被篡改,程式無法開啟,自動關閉程式。執行期間也會自動檢測。
  9. 支援自動檢測讀取秘鑰檔案,如果存在到期日期或者到期時間限制,自動顯示剩餘天數。
  10. 多重加密演算法,無法解密和破解。控制端可設定私有的加解密秘鑰。
  11. 離線使用,無需聯網,方便在各種離線裝置使用。
  12. 同時支援windows、linux、mac系統,支援所有Qt版本。

三、相關連結

  1. 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 檔名:bin_key.zip
  2. 國內站點:https://gitee.com/feiyangqingyun
  3. 國際站點:https://github.com/feiyangqingyun

相關文章