ما توی تیم موازی تصمیم گرفتیم که یه راهکار ساده اما مؤثر برای فروش امنتر نرمافزارهامون پیادهسازی کنیم. هدفمون این بود که اگر کدی رو به مشتری میفروشیم، بتونیم محدودش کنیم که برای همیشه و هرجایی ازش استفاده نکنه.
چرا سیستم لایسنس؟
وقتی کد رو به کسی میدی، عملاً کنترل از دستت خارج میشه. برای اینکه مطمئن بشیم فقط افراد مجاز، اون هم برای مدت زمان مشخص، بتونن از سیستم استفاده کنن، یه سیستم لایسنس طراحی کردیم.
ساختار کلی لایسنس
ما سیستم رو به ۳ مرحله اصلی تقسیم کردیم:
مرحله اول: ساخت شناسه یکتای سختافزاری (Unique ID)
اول باید مشخص میکردیم که چطوری بفهمیم یه سیستم خاص داره از برنامه استفاده میکنه یا نه. برای اینکار یه شناسه منحصر به فرد ساختیم با استفاده از اطلاعات سیستم.
import platform
import uuid
import hashlib
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
PERSISTENT_UID_FILE = BASE_DIR / ".project_uid"
def get_unique_id():
if PERSISTENT_UID_FILE.exists():
with open(PERSISTENT_UID_FILE, 'r') as f:
return f.read().strip()
system_info = platform.uname()
mac_address = uuid.getnode()
raw_data = f"{system_info.system}-{system_info.machine}-{mac_address}"
uid = hashlib.sha256(raw_data.encode()).hexdigest()
with open(PERSISTENT_UID_FILE, 'w') as f:
f.write(uid)
return uid
توضیح:
ما یه فایل .project_uid
میسازیم که فقط بار اول ساخته میشه. بعدش همیشه از روی اون میخونه تا اطمینان حاصل کنیم UID تغییر نکنه، حتی داخل داکر.
مرحله دوم: درخواست لایسنس از سرور
وقتی UID آماده شد، میفرستیمش به سرور لایسنس تا یه API Key و تاریخ انقضا برگردونه.
import requests
import json
LICENSE_FILE = BASE_DIR / 'license.json'
def request_license():
uid = get_unique_id()
response = requests.post('https:/your_url/get-license/', json={'unique_id': uid})
if response.status_code == 200:
data = response.json()
license_data = {
"unique_id": uid,
"api_key": data.get("api_key"),
"expiry": data.get("expiry")
}
with open(LICENSE_FILE, 'w') as f:
json.dump(license_data, f)
return True
return False
توضیح:
فایل license.json
شامل اطلاعات لایسنس ذخیره میشه. این فایل هم توی سیستم باقی میمونه.
مرحله سوم: اعتبارسنجی لایسنس
قبل از اجرای برنامه، بررسی میکنیم لایسنس معتبره یا نه.
from datetime import datetime
def is_license_valid():
if not LICENSE_FILE.exists():
return False
try:
with open(LICENSE_FILE, 'r') as f:
data = json.load(f)
uid = data.get("unique_id")
expiry = data.get("expiry")
if uid != get_unique_id():
return False
expiry_date = datetime.strptime(expiry, "%Y-%m-%d %H:%M:%S")
return expiry_date > datetime.now()
except:
return False
توضیح:
اگر UID با چیزی که داخل فایل لایسنس هست فرق داشته باشه یا تاریخ انقضا گذشته باشه، اجازه اجرا نمیدیم.
نتیجهگیری
- میتونیم کنترل کنیم چه کسی از برنامه استفاده کنه.
- جلوی استفاده مادامالعمر و بدون مجوز گرفته میشه.
- حتی اگه کد به بیرون نشت کنه، بدون لایسنس معتبر، بیاستفادهست.
این سیستم رو میشه خیلی راحت گسترش داد، مثلاً بررسی آنلاین، تمدید خودکار یا پنل مدیریت لایسنسها.
نظرت چیه؟ برام کامنت بذار تا با هم بهترش کنیم 💬