ป้องกันโปรแกรมโดน Crack ด้วยระบบ License Key
แนวคิด defense-in-depth สำหรับกันโปรแกรมโดนแครกและแชร์ต่อ: ตรวจที่เซิร์ฟเวอร์, ลายเซ็น Ed25519 offline, heartbeat และ device fingerprint — ทำไมต้องใช้หลายชั้นและจัดวางอย่างไร
ไม่มีระบบป้องกันใดกัน crack ได้ 100% — ใครยืนยันแบบนั้นคือโกหก เป้าหมายที่ทำได้จริงคือทำให้ การแครก/แชร์ “แพงกว่าการจ่ายเงินซื้อ” ด้วยการวางการป้องกันหลายชั้น (defense-in-depth) เจาะชั้นเดียวไม่พอ ต้องเจาะทุกชั้น บทความนี้อธิบายแต่ละชั้น และวิธีจัดวางด้วย KeyThai
ชั้นที่ 1: ตรวจที่เซิร์ฟเวอร์ (online validation)
อย่าตัดสินใจว่าคีย์ถูกต้องจากแอปฝั่งเดียว ให้ validate กับเซิร์ฟเวอร์ทุกครั้งที่ เปิดแอป เซิร์ฟเวอร์รู้สถานะล่าสุด: หมดอายุ, ถูกระงับ, ถูกเพิกถอน หรือเกินจำนวนที่นั่ง — ข้อมูลที่ตัวแอปไม่มีทางรู้เอง
// ชั้นที่ 1 — ตรวจที่เซิร์ฟเวอร์ทุกครั้งที่เปิดแอป (online)
import { KeyThaiClient } from "keythai-sdk";
const client = new KeyThaiClient({ apiKey: "kt_live_xxxxxxxxxxxx" });
const v = await client.validate(key, { fingerprint });
if (!v.valid) {
// status: expired | suspended | revoked ...
showError("License ใช้งานไม่ได้: " + v.status);
return quit();
}ชั้นที่ 2: ลายเซ็น Ed25519 (กัน proxy ปลอม response)
ปัญหาของการตรวจ online อย่างเดียวคือ ผู้ใช้สามารถตั้ง proxy ดักคืน { valid: true } ปลอมได้ ทางแก้คือทุก response ของ KeyThai ถูกเซ็นด้วย Ed25519 แอปคุณ verify ลายเซ็นด้วย public key ที่ฝังไว้ตอน build — private key อยู่ที่ KeyThai เท่านั้น จึงปลอม response ที่ผ่าน verify ไม่ได้
// ชั้นที่ 2 — ตรวจลายเซ็น Ed25519 เอง กัน proxy ปลอม response ว่า valid:true
import { verifySignature } from "keythai-sdk";
const v = await client.validate(key, { fingerprint });
// public key (jwk) ฝังในแอปตอน build — ไม่ดึงสดเพื่อกันสลับคีย์
if (!(await verifySignature(EMBEDDED_JWK, v))) {
throw new Error("ลายเซ็นไม่ถูกต้อง — response อาจถูกแก้ไข/ปลอม");
}วิธีนี้ยังทำให้แอป ตรวจ license แบบ offline ได้ด้วยไฟล์ .lic อ่านเชิงลึกที่ ตรวจ license แบบ offline ด้วย Ed25519
ชั้นที่ 3: Device Fingerprint (กันแชร์คีย์)
คีย์ที่ถูกต้องอย่างเดียวก๊อปได้ไม่จำกัด ผูกคีย์เข้ากับ “เครื่อง” ด้วย fingerprint แล้วจำกัด max_activations เครื่องที่ 4 (เกินโควตา) จะได้ SEAT_LIMIT_REACHED ทันที การแชร์คีย์ให้คนทั้งออฟฟิศจึงทำไม่ได้ — ดูวิธีทำที่ ป้องกันการแชร์ด้วย Device Fingerprint
ชั้นที่ 4: Heartbeat (กันแชร์ “ที่นั่ง”)
สำหรับ floating license ที่ใช้สลับกันในทีม ให้แอปส่ง heartbeat เป็นรอบ ๆ เพื่อบอกว่ายังออนไลน์ ถ้าเงียบเกิน 3 เท่าของรอบ เซิร์ฟเวอร์จะยึดที่นั่งคืนอัตโนมัติ ทำให้คน 2 คนเปิดพร้อมกันจากคีย์เดียวค้างที่นั่งไม่ได้ ดูที่ Auto-Heartbeat
สรุป: ซ้อนหลายชั้น
แต่ละชั้นปิดช่องของชั้นก่อนหน้า: online validation รู้สถานะล่าสุด, Ed25519 กันปลอม response, fingerprint กันก๊อปคีย์, heartbeat กันแชร์ที่นั่ง ใช้ร่วมกันแล้วต้นทุนการแครก จะสูงจนคนส่วนใหญ่เลือกจ่ายเงินซื้อแทน ทั้งหมดนี้ตั้งค่าได้จาก policy ใน KeyThai โดยไม่ต้อง เขียน license server เอง