本機制透過兩個維度保護軟體:
驗證資料採用 MD5 雜湊 儲存於本地檔案,防止使用者竄改。
package Admin.Control;
import java.io.*;
import java.security.MessageDigest;
import java.util.*;
public class ControlValid {
private final String REGISTER_NUMBER = "YOUR_SECRET_KEY"; // 原始驗證字串
private String md5Number; // MD5 後的字串
private String writeContent; // 待寫入檔案內容
private int loginTimesLimit = 99; // 登入次數上限
private static int loginTimesTrue = 0; // 實際登入次數
private MD5 md5Object = new MD5();
private Calendar cal = Calendar.getInstance();
private int orderTime = 0; // 到期時間 (年+月+日 簡易加總)
// 建構子初始化
public ControlValid() { ... }
// 取得註冊碼的 MD5 雜湊值
public String returnMd5String() {
try { return md5Object.MD5(REGISTER_NUMBER); }
catch (Exception e) { return null; }
}
// 核心邏輯:讀取舊檔、判斷有效性、寫入新狀態
public void writeFile() {
try {
// 1. 讀取初始化日期檔 (InitDate.txt) 取得 orderTime
// 2. 讀取控制檔 (ControlValid.txt) 解析上次登入次數
// 3. 計算目前日期 (年+月+日)
int currentDate = cal.get(Calendar.YEAR)
+ (cal.get(Calendar.MONTH) + 1)
+ cal.get(Calendar.DAY_OF_MONTH);
// 4. 判斷邏輯:未過期 且 未超次數 -> 寫入正確 MD5 與新次數
// 否則 -> 寫入亂數字串 (導致下次驗證失敗)
if (currentDate < orderTime && loginTimesTrue < loginTimesLimit) {
writeContent = returnMd5String() + "\r" + loginTimesTrue;
} else {
writeContent = String.valueOf(new Random().nextInt(10000000)) + "\r" + loginTimesTrue;
}
// 5. 寫入檔案...
} catch (Exception e) { e.printStackTrace(); }
}
// 驗證檔案中的 MD5 是否與當前計算一致
public boolean ContractRegisterString() {
String fileMd5 = readFile("ControlValid.txt").split("\n")[0];
return returnMd5String().equals(fileMd5);
}
// ... 讀檔、Getter/Setter 等輔助方法
}
MD5雜湊值\r登入次數,換行符採用 \r 相容性較好。ContractRegisterString() 永遠回傳 false。ControlValid.txt 設為隱藏屬性,試用期結束後可直接刪除檔案徹底失效。public static void main(String[] args) {
ControlValid cv = new ControlValid();
cv.writeFile(); // 每次啟動呼叫:更新次數、檢查日期
boolean valid = cv.ContractRegisterString(); // 驗證是否合法
if (!valid) {
System.exit(0); // 或彈出提示視窗
}
}
此為客戶端單機防護,屬於「君子協定」層級。專業商業軟體建議結合: